Какой токенайзер и фильтры Solr можно использовать для общего поиска по сайту? - PullRequest
3 голосов
/ 11 октября 2011

Я бы хотел убедиться, что поиск, скажем, I.B.M. можно найти, выполнив поиск ibm. Я также хотел бы убедиться, что Dismemberment Plan можно найти, выполнив поиск dismember.

Используя Solr, какой токенизатор и фильтры можно использовать для анализа и времени запросов, чтобы разрешить оба вида результатов?

1 Ответ

9 голосов
/ 11 октября 2011

Для I.B.M. => IBM
вам понадобится solr. WordDelimiterFilterFactory , который удалит специальные символы и введет слово и цифры

catenateWords = "1" объединит слова и преобразует I.B.M в IBM.

расчленение => расчленить
Необходимо включить фильтр стволов (например, solr.PorterStemFilterFactory, solr.EnglishMinimalStemFilterFactory), который будет индексировать корни слов и обеспечивать совпадения для слов, имеющих одинаковые корни.

Кроме того, вы можете использовать solr.LowerCaseFilterFactory для нечувствительных к регистру совпадений (IBM и ibm), solr.ASCIIFoldingFilterFactory для обработки иностранных символов.

Вы всегда можете использовать SynonymFilterFactory для отображения слов, которые, по вашему мнению, являются синонимами.

Вы можете применить это как во время запроса, так и во время индексации, чтобы они совпадали и конвертировались во время обоих, и результаты были согласованы.

например. тип поля def -

<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <!-- Index and Query time -->
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
        <!-- Stemmer -->
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

...