Поиск частичных слов с помощью Solr

Я пытаюсь найти часть слова с помощью Solr, но не могу заставить его работать.

Я использую это в своем schema.xml файле.

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
       <filter class="solr.StandardFilterFactory"/>
       <filter class="solr.LowerCaseFilterFactory"/>
       <filter class="solr.PorterStemFilterFactory"/>
       <filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="1" splitOnNumerics="1" splitOnCaseChange="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
  </analyzer>
</fieldType>

Поиск die h не будет работать, но die hard вернет некоторые результаты. Я переиндексировал базу данных после добавления указанной выше конфигурации.

Здесь URL-адрес и результат поиска die hard. Отладчик включен.

Здесь URL-адрес и результат поиска die h. Отладчик включен.

Я использую Solr 3.3. Здесь находится остальная часть schema.xml файла.


person Linus Oleander    schedule 08.10.2011    source источник
comment
Я решил это. перейдите по ссылке: stackoverflow.com / questions / 4824954 /   -  person wormhit    schedule 23.11.2011


Ответы (1)


Запрос, которым вы поделились, выполняет поиск в поле «title_text», но схема, которую вы опубликовали выше, определяет поле «text». Предполагая, что это была просто оплошность, и поле title_text определено, как в вашем сообщении, я думаю, что вероятная проблема заключается в том, что NGramTokenizer настроен с minGramSize = "3", и вы ожидаете сопоставления с использованием односимвольного токена.

Вы можете попробовать изменить minGramSize на 1, но это неизбежно приведет к очень неэффективным индексам; и мне интересно, действительно ли вы хотите, чтобы буква «е» соответствовала каждому фильму с буквой «е» в названии?

person Mike Sokolov    schedule 08.10.2011
comment
Можно ли определить NGramTokenizerFactory для всех индексов, а не только для text? Я попытался найти фильм The Dancing Masters с помощью Danci, и это сработало. Но поиск Danc не сработал, есть идеи почему? Разве ограничение NGramTokenizerFactory не должно быть установлено равным 3? - person Linus Oleander; 08.10.2011
comment
Анализ (токенизаторы и т. Д.) Определяются для каждого поля в Solr. Если вы хотите проиндексировать весь текст во всех ваших полях одновременно, вы можете определить copyField, который сделает это автоматически. Я подозреваю, что совпадение Danci связано с токенизацией, а не с NGram. Если вы возитесь с инструментом администратора, где вы можете увидеть результаты анализа, вы сможете это сказать. - person Mike Sokolov; 08.10.2011
comment
Использование copyField отлично поработало. Вот результат. Знаете ли вы какие-нибудь другие фильтры богов, которые я мог бы включить в свой файл schema.xml? - person Linus Oleander; 08.10.2011
comment
Разве title_text не будет соответствовать динамическому *_text Sunspot, который имеет тип text, определенный в вопросе? Значит, первое предложение в ответе не актуально? - person lulalala; 19.07.2012
comment
lulalala Я не знаю, при чем тут Солнечное пятно? ОП не упомянул об этом. - person Mike Sokolov; 28.02.2013