在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 taffytermFreq=29匹配下的depreciation tax。我也不确定这与它们之间的关系,就像我在持有此文档的分片中想象的那样,depreciationdepreciation taxdepreciation tafffy的计数有很大不同

这是预期的行为吗? ES是否以相同的IDF值处理所有不同大小的带状疱疹,包括字母组合?我是否需要使用不同的分析器将每个瓦片大小分成不同的子字段,以获得我期望的行为?

最佳答案

TL; DR
Elastic / Lucene破坏了带状疱疹和同义词,在发布修复程序之前(ES 6以来是准确的),需要应用许多技巧。

  • 将会标,双字母组等放在各个子字段中,然后分别搜索它们,并组合得分以构成整体匹配项。不要在执行多个n-gram配置的字段上使用单个带状滤波器
  • 不要在同一个字段上组契约(Contract)义词和带状疱疹过滤器。

  • 在我的情况下,我用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”中获得了带状疱疹,并且以某种方式与文档匹配。不知道为什么,因为我只将同义词应用于查询,而不是文档,所以看不到匹配项。同样,从查询创建带状疱的方式也是错误的。

    10-07 11:59