将聚合限制为弹性搜索中的热门内容

Posted

技术标签:

【中文标题】将聚合限制为弹性搜索中的热门内容【英文标题】:Limiting aggreation to the top X hits in elasticsearch 【发布时间】:2014-10-15 07:08:33 【问题描述】:

ElasticSearch 根据查询的所有命中构建聚合结果,独立于 from 和 size 参数。这是我们在大多数情况下想要的,但我有一个特殊情况,我需要将聚合限制为前 N 个命中。限制过滤器不适合,因为它不获取最好的 N 个项目,而只获取与查询(每个分片)匹配的第一个 X,与它们的分数无关。

有没有什么方法可以构建一个命中数上限为 N 的查询,以便能够构建一个仅限于前 N 个结果的聚合?如果是的话怎么办?

附属问题:限制匹配文档的分数可能是一种替代方法,即使在我的情况下我需要一个固定的界限。 min_score 参数是否影响聚合?

【问题讨论】:

你是怎么做到的?我有完全相同的问题,并且会很高兴任何提示如何实现这一点。谢谢! 【参考方案1】:

您正在寻找Sampler Aggregation。

我有一个类似的答案解释here

(可选)您可以使用字段或脚本和 max_docs_per_value 设置以控制在任何设备上收集的最大文档数量 一个具有共同价值的分片。

【讨论】:

【参考方案2】:

如果您使用的是版本 > 1.3 的 ElasticSearch 集群,则可以通过将 top_hits 聚合 嵌套在聚合中,按所需字段排序并将 size 参数设置为 X 来使用它。

相关文档可以在here找到。

【讨论】:

根据我从文档中了解到的情况,这确实解决了我的问题。我想聚合我的范围查询的热门点击,而不是访问每个桶的热门点击(这是 top_hits 聚合提供的)。 完全正确;如果您可以拥有 top_hits 聚合的子聚合,它可能会起作用。但由于某种原因,top_hits 聚合不接受子聚合。【参考方案3】:

我需要将聚合限制为前 N 次点击

使用嵌套聚合,您的顶部存储桶可以代表这 N 个命中,嵌套聚合在该存储桶上运行。我会为***聚合尝试 filter 聚合。

棘手的部分是在过滤器中以某种方式使用 _score 并将其完全限制为 N 个条目...有一个 limit 过滤器适用于每个分片,但我认为它不会在这种情况下工作。

【讨论】:

限制过滤器确实不起作用,因为它只在与查询匹配的前 X 个文档处停止,与我需要考虑的分数无关。 对于过滤器聚合,我需要一个 top_hits 过滤器......但这似乎不存在。【参考方案4】:

看起来Sampler Aggregation 现在可以用于此目的。请注意,它仅适用于 Elastic 2.0。

【讨论】:

以上是关于将聚合限制为弹性搜索中的热门内容的主要内容,如果未能解决你的问题,请参考以下文章

应用聚合后过滤掉弹性搜索中的术语聚合桶

跨域解决请求限制(script标签)(热门搜索出现对应的词条)

11073 最热门的K个搜索串

如何在弹性搜索的过滤器聚合中引用多个嵌套级别?

Mongodb 聚合管道限制 $lookup 字段

为啥聚合函数会限制记录