1

我试图突出显示查询中的确切搜索词,但突出显示的词作为我标记化字段中最短的标记返回。例如,查询“Entr”将导致突出显示Entr。我希望高亮返回Entry

这是匹配答案中每个术语实例的最简单查询: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 从单词的后面进行匹配,但这会在单词的中间停止匹配。

4

1 回答 1

0

该字段需要查询。索引器工作正常,但它匹配所有内容并返回第一个匹配令牌。结合查询分析器,只匹配最长的结果。

<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>
于 2019-04-18T18:25:25.643 回答