【问题标题】:Does Elasticsearch score different length shingles with the same IDF?Elasticsearch 是否使用相同的 IDF 对不同长度的带状疱疹进行评分?
【发布时间】:2018-09-07 19:49:28
【问题描述】:

在 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 的二元标记匹配会比一元标记depreciation 的匹配获得更高的分数。然而,这个得分似乎反映了一个简单的一元匹配。有一个非常小的差异,进一步挖掘这是因为depreciation taffy 下的termFreq=28 匹配,depreciation tax 下的termFreq=29 匹配。我也不确定这有什么关系,因为我想象在持有此文档的分片中,depreciationdepreciation taxdepreciation tafffy 的计数非常不同

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

【问题讨论】:

    标签: elasticsearch search lucene elasticsearch-5 relevance


    【解决方案1】:

    TL;DR 带状疱疹和同义词在 Elastic/Lucene 中被破坏,并且需要应用许多 hack,直到发布修复程序(准确到 ES 6)。

    1. 将一元、二元等放在各个子字段中,并分别搜索它们,组合得分以获得整体匹配。不要在执行多个 n-gram 配置的字段上使用单个 shingle 过滤器
    2. 不要在同一个字段上组合同义词和 shingle 过滤器。

    在我的情况下,我在 unigram 字段上使用同义词进行 must 匹配,然后进行一系列应该匹配以提高每种尺寸的带状疱疹的分数,没有同义词

    详情

    我在弹性支持论坛上得到了答案: https://discuss.elastic.co/t/does-elasticsearch-score-different-length-shingles-with-the-same-idf/126653/2

    是的,这是意料之中的。

    导致得分异常的并不是真正的带状疱疹,而是事实 SynonymQueries 执行您正在执行的频率混合行为 看到。他们将原始令牌的频率用于所有 随后的“同义词”标记,以帮助防止歪斜 评分结果。同义词通常比较少见,并且会 如果他们每个人都使用自己的个人,则会极大地影响得分 df的。

    来自 Lucene 文档:

    出于评分目的,此查询尝试对术语进行评分,就好像您 已将它们索引为一个术语:它将匹配任何术语,但仅 单次调用相似度,对所有项的总和进行评分 文档的频率。

    SynonymQuery 还将 docFrequency 设置为最大值 doc 文档中术语的频率。例如,如果:

    "deprecation"df == 5 "deprecation tax"df == 2, "deprecation taffy"df == 1,它将使用 5 作为 docFrequency 进行评分。

    更大的问题是 Lucene 没有办法区分 来自同义词的带状疱疹......它们都使用重叠的标记 令牌流中其他令牌的位置。所以如果一元组是混合的 使用双(或更大)-grams,Lucene 被欺骗认为它是 实际上是同义词。

    解决方法是让你的 unigrams 和 bi-plus-grams 保持不同 字段。这样 Lucene 就不会尝试在这些中使用 SynonymQueries 情况,因为位置不会再重叠了。

    这是我问的另一个相关问题,它与实际同义词在与带状疱疹结合时如何被破坏有关。 https://discuss.elastic.co/t/es-5-4-synonyms-and-shingles-dont-seem-to-work-together/127552

    Elastic/Lucene 扩展同义词集,将它们注入令牌流,然后创建 shingles。例如。查询:econ supply and demand => econ, economics, supply, demand。文档:`... econ foo ... => econ, foo '。现在我们从查询“经济经济学”中得到了一个木瓦,它以某种方式与文档相匹配。不知道为什么,因为我只将同义词应用于查询,而不是文档,所以我看不到匹配项。此外,从查询中创建带状疱疹的方式也是错误的。

    这是known problem,仍未完全解决。一个号码 的 Lucene 过滤器不能使用图形作为其输入。

    目前正在积极开展工作以开发fixed shingle filter,并且还有一个想法是有一个用于索引的子字段 带状疱疹。

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2015-02-09
      • 2019-01-04
      • 1970-01-01
      相关资源
      最近更新 更多