将聚合限制为弹性搜索中的热门内容
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。
【讨论】:
以上是关于将聚合限制为弹性搜索中的热门内容的主要内容,如果未能解决你的问题,请参考以下文章