Использование нескольких токенизаторов в Solr - PullRequest
10 голосов
/ 05 августа 2010

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

У меня настроена схема Solr в тот момент, когдабыл изменен, так что я могу запрашивать и возвращать результаты независимо от того, в каком случае они.Так что, если я буду искать iPOd, я увижу, что iPod вернулся.Код для этого:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
  </analyzer>
...
</fieldType>

Я нашел этот код, который позволит нам выполнить частичный запрос на совпадение слов, но я не думаю, что у меня может быть два токенизатора в одном поле.

<fieldType name="text" class="solr.TextField" >
  <analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
...
</fieldType>

Так что же я могу сделать, чтобы также выполнить этот токенизатор на поле?
Или есть способ объединить их?
Или есть другой способ выполнить эту задачу?

Ответы [ 2 ]

10 голосов
/ 05 августа 2010

Объявите другой fieldType (то есть другое имя) с токенайзером NGram, затем объявите поле, которое использует fieldType с NGram, и другое поле со стандартным «text» fieldType.Используйте copyField для копирования одного на другой.См. Индексирование одних и тех же данных в нескольких полях .

8 голосов
/ 05 апреля 2011

В качестве альтернативы можно применить EdgeGramFilterFactory к существующему полю и остаться с вашим текущим токенизатором (WhitespaceTokenizerFactory), например,

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />

Это позволит сохранить вашу текущую схему без изменений, т. Е. Вам не потребуется дополнительное поле с другим токенизатором (NGramTokenizerFactory)

Ваше поле будет выглядеть примерно так:

   <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
  </analyzer>
...
</fieldType>
...