Индексирование оригинальных токенов в solr - PullRequest
1 голос
/ 26 апреля 2020

Допустим, у меня тип поля следующий:

<fieldType name="text_body" class="solr.TextField" positionIncrementGap="100" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" catenateWords="1" preserveOriginal="1"/>
    <filter class="solr.FlattenGraphFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Моя цель - индексировать для каждого токена исходный токен, а также токен после прохождения всех фильтров токена. Например, для текста:

"My dog is barking #DOGS"

Текущий тип поля (как упомянуто выше) будет индексировать следующие токены:

"my", "dog", "bark", "dogs", "#dogs" 

"is" будет удалено из-за stopWords фильтр, и «лай» станет «корой» из-за фильтра stemming.

Мне бы хотелось, чтобы были проиндексированы следующие токены:

"My", "my", "dog", "barking", "bark", "dogs", "#DOGS".

Я рассмотрел параметр "perserveOriginal" в WordDelimiterGraphFilterFactory, но он работает только для токенов со специальными символами, и после этого «оригинальный токен» пропускает другие фильтры.

Я знаю, что очевидным способом является написание собственного TokenFilter, который индексирует токены в их первоначальная форма сразу после токенизатора, но мой вопрос в том, есть ли что-то встроенное в Solr, которое позволяет это.

Я использую Solr 6.5.1

Спасибо:)

1 Ответ

0 голосов
/ 01 мая 2020

Хороший вопрос, связанный с поддержанием релевантности поиска естественного языка, вероятно, помогут следующие.

Если поля для поиска являются только полями упомянутого filedType, то есть «text_body», и вы хотите, чтобы оба были и оригинальные токаны для поиска всех файлов в вашем списке файлов для поиска;

Затем попробуйте создать дополнительное поле (скажем, field_withoutStemmer) с другим fieldType, например, "text_body", но без следующего фильтра:

<filter class="solr.PorterStemFilterFactory"/>

В дополнение к этому, если вы используете анализатор запросов dismax / edismax, вы можете установить параметр "t ie" с ненулевым значением (вероятно, tie = 1.0).

Установка «tie = 1.0» сгенерирует счет документа = сумму баллов для обоих полей соответствующего документа; в противном случае он будет разделен, и у вас будет только один высокий балл в обоих полях.

...