Как выделить самый длинный solr токен - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь выделить точный поисковый термин из запроса, но выделенный термин возвращается как самый короткий токен из моего поля токенов.Например, запрос «Entr» приведет к выделению Ent ry.Мне бы хотелось, чтобы подсветка возвращала 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 Ответ

0 голосов
/ 18 апреля 2019

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

<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>
...