在Elasticsearch 5.6.5中,我正在搜索应用了以下过滤器的字段:
"filter_shingle":{
"max_shingle_size":"4",
"min_shingle_size":"2",
"output_unigrams":"true",
"type":"shingle"
}
当我对具有该确切文本的文档执行depreciation tax
搜索时,我看到以下分数解释:
weight(Synonym(content:depreciation content:depreciation tax)) .... [7.65]
weight(content:tax) ... [6.02]
如果我将搜索更改为depreciation taffy
内容中带有depreciation tax
的完全相同的文档,我会得到以下解释:
weight(Synonym(content:depreciation content:depreciation taffy)) .... [7.64]
这不是我所期望的。我认为depreciation tax
的双元标记上的匹配会比 unigramdepreciation
上的匹配获得更高的分数。然而,这个评分似乎反映了一个简单的单字母匹配。差异非常小,进一步挖掘这是因为termFreq=28
在depreciation taffy
匹配下,termFreq=29
在depreciation tax
匹配下。我也不确定这有什么关系,因为我想象在持有此文档的碎片中,depreciation
、depreciation tax
和depreciation tafffy
的计数非常不同
这是预期行为吗?ES 是否使用相同的 IDF 值处理所有不同尺寸的带状疱疹,包括 unigram?我是否需要使用不同的分析仪将每个带状疱疹尺寸拆分为不同的子字段才能获得我期望的行为?
TL;博士带状疱疹和同义词在 Elastic/Lucene 中被破坏,在发布修复程序之前需要应用很多黑客(截至 ES 6 准确)。
将- unigram、bigram 等放在单独的子字段中并单独搜索它们,将分数组合在一起以获得整体匹配。不要在执行多个 n 元语法配置的字段上使用单个带状疱疹过滤器
- 不要在同一字段上组合同义词和带状疱疹过滤器。
就我而言,我在 unigram 字段上与同义词进行must
匹配,然后进行一系列应该匹配以提高每种尺寸的带状疱疹的分数,没有同义词
详
我在弹性支持论坛上得到了答案: https://discuss.elastic.co/t/does-elasticsearch-score-different-length-shingles-with-the-same-idf/126653/2
是的,这主要是意料之中的。
这并不是带状疱疹导致得分怪异,而是事实 同义词查询执行您正在的频率混合行为 看到。他们使用原始令牌的频率用于所有 后续的"同义词"标记,以帮助防止扭曲 得分结果。同义词通常相对罕见,并且会 如果他们每个人都使用各自的得分,则会极大地影响得分 DF的。
来自 Lucene 文档:
出于评分目的,此查询尝试对术语进行评分,就好像您 将它们索引为一个术语:它将匹配任何术语,但仅匹配 调用一次相似性,对所有项的总和进行评分 文档的频率。
SynonymQuery 还将 docFrequency 设置为 doc文档中术语的频率。例如,如果:
"弃用"DF == 5 "弃用税"DF == 2, "弃用太妃糖"DF == 1,它将使用 5 作为 docFrequency 进行评分。
更大的问题是Lucene没有办法区分。 同义词中的带状疱疹...它们都使用与 其他令牌在令牌流中的位置。所以如果单字母混合 对于双克(或更大),Lucene被欺骗认为它是 实际上是一个同义词的情况。
解决方法是将您的单元组和双加元组保持不同的 领域。这样Lucene就不会尝试在这些中使用SynonymQuery。 情况,因为位置将不再重叠。
这是我问的另一个相关问题,它与实际的同义词在与带状疱疹结合使用时如何被破坏有关。 https://discuss.elastic.co/t/es-5-4-同义词和带状疱疹似乎不一起工作/127552
Elastic/Lucene 扩展同义词集,将它们注入到令牌流中,然后创建带状疱疹。 例如查询:econ supply and demand => econ, economics, supply, demand
.文档:"...经济 foo ... =>econ, foo '.现在我们从查询"经济经济学"中得到带状疱疹,不知何故这与文档相匹配。不知道为什么,因为我只将同义词应用于查询,而不是文档,所以我看不到匹配项。此外,从查询创建带状疱疹的方式也是错误的。
这是一个已知问题,但仍未完全解决。一个数字 的 Lucene 过滤器不能使用图形作为其输入。
目前正在积极开发一个固定的 带状疱疹过滤器,还有一个想法,有一个用于索引的子字段 瓦。