Elasticsearch是否使用相同的IDF评分不同长度的带状疱疹?

时间:2018-03-29 00:17:35

标签: elasticsearch search lucene elasticsearch-5 relevance

在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的二元组标记上的匹配将比unigram depreciation上的匹配得分高得多。然而,这个得分似乎反映了一个简单的单字组比赛。由于termFreq=28匹配下的depreciation taffytermFreq=29下的depreciation tax匹配,因此存在极小的差异并进一步挖掘。我也不确定这是如何相关的,因为我想通过持有此文档的分片,depreciationdepreciation taxdepreciation tafffy

的计数有很多不同

这是预期的行为吗? ES是否使用相同的IDF值治疗所有不同大小的带状疱疹,包括unigrams?我是否需要使用不同的分析器将每个木瓦尺寸拆分为不同的子区域以获得我期望的行为?

1 个答案:

答案 0 :(得分:2)

<强> TL; DR 在Elastic / Lucene中破坏了带状疱疹和同义词,并且在修复发布之前需要应用许多黑客攻击(从ES 6开始就是准确的)。

  1. 将unigrams,bigrams等放在单个子字段中并单独搜索,将整体匹配的分数组合在一起。不要在执行多个n-gram配置的字段上使用单个木瓦过滤器
  2. 不要在同一个字段上组合同义词和shingle过滤器。
  3. 在我的情况下,我在unigram字段上与同义词进行must匹配,然后一系列应该匹配以提高每个大小的带状疱疹得分,而不是同义词

    <强>详情

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

      

    是的,这主要是预期的。

         

    不是真正的带状疱疹导致得分奇怪,但实际上   SynonymQueries执行您的频率混合行为   看到。他们使用原始令牌的频率为所有   后续&#39;同义词&#39;代币,作为一种有助于防止倾斜的方式   得分结果。同义词通常比较少见,而且会   如果每个人都使用他们的个人,就会大大影响他们的得分   DF&#39; S

         

    来自Lucene文档:

         

    出于评分目的,此查询会尝试像对您一样对这些字词进行评分   将它们编入索引作为一个术语:它将匹配任何条款,但仅限于   一次调用相似度,对所有项的总和进行评分   文件的频率。

         

    SynonymQuery还将docFrequency设置为最大值   docFrequency的文件中的条款。例如,如果:

         

    &#34;弃用&#34; df == 5&#34;弃用税&#34; df == 2,&#34;弃用太妃糖&#34; df   == 1,它将使用5作为docFrequency进行评分。

         

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

         

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

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

    Elastic / Lucene扩展同义词集,将它们注入令牌流,然后创建带状疱疹。例如。查询:econ supply and demand => econ, economics, supply, demand。文件:`... econ foo ... =&gt; econ,foo&#39;。现在我们从查询&#34;经济经济学&#34;并以某种方式匹配文档。不知道为什么,因为我只对查询应用了同义词,而不是文档,所以我没有看到匹配。此外,从查询中创建带状疱疹的方式也是错误的。

      

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

         

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