【问题标题】:Solr FastVector phrase highlight on multivalued fieldSolr FastVector 短语突出显示多值字段
【发布时间】:2021-10-11 02:43:39
【问题描述】:

Solr 社区!我在这个问题上花了很多时间......我真的需要一些指导。

问题: 带有 slop 的短语查询与文档匹配,但荧光笔与 sn-p 不匹配,即使它在文档中。

我们有一个庞大的法律文件数据库。当我们的用户使用搜索时,他们希望在段落内进行搜索以获得更相关的结果。他们不关心文档,查询中的单词分散在文档周围。 我们使用 PhraseQuery 实现了这个功能,它在一个值之间有很大差距的多值字段上使用了 slop。每个值都是与文本分开的段落。 positionIncrementGap=5000

这是我们的字段配置:

    <fieldType name="text_split_by_paragraphs" class="solr.TextField" positionIncrementGap="5000" autoGeneratePhraseQueries="true">
    <analyzer>
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.HunspellStemFilterFactory" dictionary="uk_UA.dic" affix="uk_UA.aff"/> 
    </analyzer>
    <similarity class="solr.BM25SimilarityFactory">
          <str name="k1">0.4</str>
          <str name="b">0.2</str>
    </similarity>
</fieldType>

<field name="f_text_paragraphs" type="text_split_by_paragraphs" indexed="true" stored="true" multiValued="true" required="false" omitNorms="false" termVectors="true" termPositions="true" termOffsets="true" />

假设我们将这个非常简单的数据存储在 f_text_paragraphs 字段中。每个值之间的位置差距为5000,如上所述:

  • “苹果很好吃”,
  • “苹果让我快乐”,

让我们运行一些伪查询。

  • 查询:f_text_paragraphs:"苹果好吃"~5000 - OK
  • 查询:f_text_paragraphs:"delicious apple"~5000 - 确定
  • 查询:f_text_paragraphs:"delicious happy"~5000 - 失败,这是正确的,因为单词在 multiValued 字段的不同值中。

查询功能按预期工作,完美。但是突出显示的方式不同...... 以下是高亮设置:

hl=true&
hl.useFastVectorHighlighter=true&
hl.usePhraseHighlighter=false&
hl.highlightMultiTerm=true&
hl.fragmentsBuilder=colored& // custom builder
hl.boundaryScanner=breakIterator&
f.f_text_paragraphs.hl.fragsize=400&
f.f_text_paragraphs.hl.maxAnalyzedChars=2147483647&
f.f_text_paragraphs.hl.snippets=5&
hl.fl=f_text_paragraphs&

使用 hl.usePhraseHighlighter=true

  • 查询:f_text_paragraphs:"Apple delicious"~5000 - 好的,返回 sn-p。
  • 查询:f_text_paragraphs:"delicious apple"~5000 - 失败,即使搜索与相同的查询匹配。看起来当 usePhraseHighlighter 设置为 true 时,SOLR 会保留词序......这不是我们需要的。

使用 hl.usePhraseHighlighter=false

  • 查询:f_text_paragraphs:“苹果美味”~5000 - 好的,但它也添加了第二个值 “苹果让我开心”,因为 SOLR 出于某种原因忽略了 slop 并匹配第二个值,只是因为里面有 Apples 字样。
  • 查询:f_text_paragraphs:"delicious apple"~5000 - 可以,但问题与上述相同。

问题:如何让荧光笔尊重slop,忽略词序?返回 sn-ps,其中所有单词都在同一段落中 (slop=5000)。我们期望与搜索查询相同的逻辑。

【问题讨论】:

  • 您可以添加 &debugQuery=true(或 &debug=true)并打印查询的解析树吗?
  • @D_K 当然。作为旁注,我们使用自定义查询解析器,所以我总是知道生成了什么查询。这是一个查询和高亮查询(我删除了所有字段,只留下与此问题相关的一个)parsedquery_toString: " boost(+(+((f_text_paragraphs:"доданий загальний вартість"~5000) ((+id:ДОДАНУ ЗАГАЛЬНУ ВАРТІСТЬ)))~0.5)highlight:QueryToHighlight: [ [ "org.apache.lucene.search.PhraseQuery:f_text_paragraphs:"доданий загальний вартість"~5000" ],
  • @D_K 搜索查询匹配文档,但 sn-p 为空。如果我将查询替换为“загальний доданий вартість”,它将显示 sn-p(因为在文本中单词的顺序相同)
  • 不确定,如果这会有所帮助,有两件事:1. 你使用solr.apache.org/guide/8_9/… 吗?哪个是特定于语言的 2. 你能确保向量已使用 luke 正确索引吗?
  • 其实,我想我可能知道发生了什么。由于您的位置差距为 5000,因此荧光笔可能无法正常工作。我一直在进行自定义查询解析,并且还必须对荧光笔进行调整。在任何情况下,您都可以尝试改变 hl.phraseLimit “搜索得分最高的短语时要分析的最大短语数。默认值为 5000。”

标签: solr lucene solrj solrcloud


【解决方案1】:

Lucene/Solr 的“Unified Highlighter”通常是最好的。它是最准确的荧光笔,实际上是在与您工作(合法搜索)相同的搜索域中构建/设计的,其中高亮的准确性非常重要。使用hl.method=unified 切换到它。请务必查看documentation 了解更多详细信息。 (酌情切换到您的 Solr 版本的文档)。

顺便说一句,Solr community 最好在它的用户列表和 Slack 中找到;没有那么多 Stackoverflow。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 2013-10-16
    • 2011-04-30
    • 2011-06-07
    • 1970-01-01
    • 2015-11-27
    相关资源
    最近更新 更多