Как в Apache Solr выделить только поисковый запрос?

Я пытаюсь получить правильное выделение, используя Apache Solr. В случае частичного совпадения я хочу выделить совпадающую часть слова. Однако вместо этого выделяется целое слово (которое частично соответствует поисковому запросу).

Пример:

Выполните поиск по запросу "adida shi", в результате вы получите два предмета: один с названием "рубашки adidas", а другой - "красные рубашки adidas".

/select?q=name:adida+shi&hl=true&hl.fl=name&qt=standardwt=json

Ожидаемое выделение:

<em>adida</em>s <em>shi</em>rts
<em>adida</em>s red <em>shi</em>rts

Актуальная подсветка:

<em>adidas</em> <em>shirts</em>
<em>adidas</em> red <em>shirts</em>

Поле, которое используется для выделения, определяется следующим образом в schema.xml:

<field name="name" type="autocomplete_text" indexed="true" stored="true"/>    

Тип поля для поля выглядит так:

<fieldType name="autocomplete_text" class="solr.TextField" positionIncrementGap="100">
     <analyzer type="index">
       <tokenizer class="solr.WhitespaceTokenizerFactory"/>
       <filter class="solr.LowerCaseFilterFactory" />
       <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
    </analyzer>
    <analyzer type="query">
       <tokenizer class="solr.WhitespaceTokenizerFactory"/>
       <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>  

У меня нет конкретной конфигурации для выделения в основном файле конфигурации.

Я использую Solr v6.0.1. Подсветка работала, как и ожидалось, с solr v4.10.4 с той же конфигурацией. Я просмотрел следующие разделы вики Solr и попробовал различные параметры выделения, но не смог заставить его работать:

https://cwiki.apache.org/confluence/display/solr/Highlighting https://cwiki.apache.org/confluence/display/solr/Standard+Highlighter

Есть идеи, как заставить его работать?


person Ugur Adigüzel    schedule 21.07.2016    source источник
comment
Я думаю, это может быть потому, что вы использовали тип поля автозаполнения. он должен выделять только адида и ши. изменить определение поля и попробовать   -  person Vinod    schedule 21.07.2016
comment
EdgeNGramFilterFactory работает должным образом? Раньше у меня была такая же проблема, и я подтвердил, что при генерации токенов сообщалось о неверных смещениях. Я проверил Jira, и проблема то закрывается, то снова открывается.   -  person AR1    schedule 21.07.2016
comment
Вы правы @ AR1. Похоже, что EdgeNGramFilter не работает должным образом, а именно, как вы сказали, он сообщает о неправильных смещениях при генерации токенов. Это изменение поведения вводится с патчем для следующего тикета: issues.apache.org/jira / browse / LUCENE-3907.   -  person Ugur Adigüzel    schedule 26.07.2016
comment
Похоже, кто-то другой задал тот же вопрос в группе пользователей, но не смог получить ответа: signaldump.org/solr/qpod/28142/. Предложения по использованию других фильтров, кроме EdgeNGramFilterFactory, для реализации ожидаемого поведения?   -  person Ugur Adigüzel    schedule 26.07.2016
comment
Я добавил в ответ способ решения этой проблемы. Пожалуйста, примите это, если вам это нравится.   -  person AR1    schedule 26.07.2016


Ответы (1)


Добавление ответа в качестве дополнения к предыдущим комментариям.

Проблема, скорее всего, вызвана тем, что EdgeNGramFilterFactory не работает должным образом и вместо этого сообщает о неправильных смещениях при генерации токенов. Такая проблема повторно открывалась в Jira несколько раз в последних версиях Solr.

Я решил это в производственной установке luceneMatchVersion = "4.5" (или любой другой версии, которая работала для вас, для NGramFilterFactory.

У меня есть это решение в комментарии Jira, но я не могу его найти, поэтому прошу прощения, но я не могу добавить его в качестве ссылки.

person AR1    schedule 26.07.2016
comment
Спасибо за ответ, но этот способ решения проблемы больше не работает. Различное поведение, основанное на luceneMatchVersion, очевидно, удалено из Lucene v5 на. Отметьте EdgeNGramTokenFilter Lucene v4 против EdgeNGramTokenFilter Lucene v5 - person Ugur Adigüzel; 26.07.2016