【发布时间】: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