Как выделить самый длинный solr токен

Я пытаюсь выделить точный поисковый термин из запроса, но выделенный термин возвращается как самый короткий токен из моего поля токенов. Например, запрос "Entr" приведет к выделению Entry. Я бы хотел чтобы подсветка возвращала Entr y

Это самый простой запрос, который соответствует каждому экземпляру термина в ответе: q=Title_Tokens:Entr&hl=on&hl.fl=Title_Tokens&hl.useFastVectorHighlighter=true

Удаление FastVectorHighlighter дает весь термин, но только один раз за результат, а в некоторых случаях он не совпадает.

Я попытался добавить в hl.q, hl.highlightingMultiTerm, hl.usePhraseHighlighter и некоторые другие переменные, но я могу получить только каждый экземпляр самого короткого токена или первый экземпляр поискового термина.

Поле, которое я пытаюсь выделить, это Title_Tokens, который копируется из строки.

<field name="RawTitle" type="string" required="true" />
<field name="Title_Tokens" type="Tokenized_Title" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/>
<copyField source="RawTitle" dest="Title_Tokens" />

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

Анализируя мое поле для "entr", я вижу токены для "ent, entr и ntr". Для меня это выглядит так, как будто первый токен для сопоставления выделен, но я хочу расставить приоритеты для самого длинного совпадения. Это то, что происходит, или я делаю что-то еще неправильно?

Я также рассмотрел использование EdgeNGramTokenizerFactory для сопоставления с конца слова, но это остановило бы совпадения в середине слова.

1 ответ

Решение

Поле нуждалось в запросе. Индексатор работал правильно, но совпадал по всем параметрам и возвращал первый соответствующий токен. В сочетании с анализатором запросов сопоставляется только самый длинный результат.

<fieldType name="Tokenized_Title" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="1" maxGramSize="15" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
Другие вопросы по тегам