在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]
这不是我所期望的。我认为与unigram
depreciation tax
上的匹配相比,与ramt token 上的depreciation
匹配将获得更高的分数。但是,此分数似乎反射(reflect)了简单的字母组合匹配。差异非常小,需要进一步挖掘,这是因为termFreq=28
匹配下的depreciation taffy
和termFreq=29
匹配下的depreciation tax
。我也不确定这与它们之间的关系,就像我在持有此文档的分片中想象的那样,depreciation
,depreciation tax
和depreciation tafffy
的计数有很大不同这是预期的行为吗? ES是否以相同的IDF值处理所有不同大小的带状疱疹,包括字母组合?我是否需要使用不同的分析器将每个瓦片大小分成不同的子字段,以获得我期望的行为?
最佳答案
TL; DR
Elastic / Lucene破坏了带状疱疹和同义词,在发布修复程序之前(ES 6以来是准确的),需要应用许多技巧。
在我的情况下,我用unigram字段上的同义词进行
must
匹配,然后进行一系列应匹配,以提高每种尺寸带状疱疹的得分,而没有同义词详细信息
我在 flex 支持论坛上得到了答案:
https://discuss.elastic.co/t/does-elasticsearch-score-different-length-shingles-with-the-same-idf/126653/2
这是我问的另一个相关问题,涉及与带状疱疹结合时实际同义词如何也被修饰。 https://discuss.elastic.co/t/es-5-4-synonyms-and-shingles-dont-seem-to-work-together/127552
Elastic / Lucene扩展同义词集,将其注入(inject) token 流,然后创建带状疱疹。例如。查询:
econ supply and demand => econ, economics, supply, demand
。文件:`... econ foo ... => econ,foo'。现在,我们从查询“econ Economics”中获得了带状疱疹,并且以某种方式与文档匹配。不知道为什么,因为我只将同义词应用于查询,而不是文档,所以看不到匹配项。同样,从查询创建带状疱的方式也是错误的。