Как выделить самый длинный 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>