太阳社区!我在这个问题上花了这么多时间...我真的需要一些指导。
**问题:**带有slop的短语查询与文档匹配,但荧光笔与代码段不匹配,即使代码段在文档中。
我们有一个庞大的法律的文件数据库。当我们的用户使用搜索时,他们希望搜索段落内部,以获得更多相关的结果。他们不关心文件,其中来自查询的单词分散在文档中。我们在值之间有很大间隔的多值字段上使用带slop的PhraseQuery实现了此功能。每个值都是文本中的一个单独段落。位置增量间隙=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_paragrations字段中,每个值之间的位置间隔是5000,如上所述:
- “苹果很好吃,”
- “苹果让我快乐,”
让我们运行一些伪查询。
- 查询:f_text_paragrations:“苹果好吃”~5000 -好的
- 查询:f_text_paragrations:“美味的苹果”~5000 -确定
- 查询:f_text_paragrations:“美味快乐”~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.使用短语荧光笔=true:
- 查询:f_text_paragrations:“苹果美味”~5000 - OK,返回代码片段。
- 查询:f_text_paragrations:“美味的苹果”~5000 -失败,即使搜索与相同的查询匹配。看起来当usePhraseHighlighter设置为true时,SOLR会保留词序...这不是我们需要的。
使用hl.使用短语荧光笔=false:
- 查询:f_文本_段落:“Apple delicious”~5000 - OK,但它还添加了第二个值“Apples make me happy”,因为出于某种原因SOLR忽略了slop,只匹配了第二个值,因为里面有Apples单词。
- Query:f_text_paragrations:“美味的苹果”~5000 -还可以,但是和上面一样的问题。
**问题:**如何让highlighter尊重slop而忽略单词顺序?返回代码片段,其中所有单词都在同一个段落中(slop=5000)。我们期望与搜索查询相同的逻辑。
1条答案
按热度按时间brgchamk1#
Lucene/Solr的“Unified Highlighter”通常是最好的一款。它是最精确的荧光笔,事实上它是在你正在工作的同一个搜索域(法律的搜索)中构建/设计的,在这个搜索域中,高亮的精确度是非常重要的。使用
hl.method=unified
切换到它。确保检查documentation以获得大量的细节。(根据需要切换到你的Solr版本的文档)。顺便说一句,Solr community最好在它的用户列表和Slack中找到;而不是堆栈溢出。