ElasticSearch基于查询的所有命中构建聚合结果,与from和size参数无关。这是我们在大多数情况下想要的,但我有一个特殊情况,我需要将聚合限制在前N个命中。限制过滤器不适合,因为它不能获取最好的N个项目,而只能获取与查询匹配的第一个X(每个分片),而与其分数无关。
有没有办法构建一个命中数上限为N的查询,以便能够构建一个限制在那些前N个结果中的聚合?如果是这样的话?
辅助问题:限制匹配文档的分数可能是另一种选择,即使在我的情况下我需要一个固定的界限。 min_score参数是否会影响聚合?
答案 0 :(得分:0)
如果您使用版本为>的ElasticSearch集群; 1.3,您可以使用 top_hits聚合将其嵌套在聚合中,在您想要的字段上排序,并将size
参数设置为X.
可以找到相关文档here。
答案 1 :(得分:0)
我需要将聚合限制在前N个点击
使用嵌套聚合,您的顶级存储桶可以表示N个命中,并在该存储桶上运行嵌套聚合。我会为顶级聚合尝试filter
聚合。
棘手的部分是在过滤器中以某种方式使用_score
并将其精确限制为N个条目......每个碎片都有一个limit
过滤器,但我不知道我认为它可以在这种情况下发挥作用。
答案 2 :(得分:0)
看起来Sampler Aggregation现在可用于此目的。请注意,它仅适用于Elastic 2.0。
答案 3 :(得分:0)
您正在寻找Sampler Aggregation。
我有一个类似的答案解释here
或者,您可以使用字段或脚本以及max_docs_per_value 用于控制任何文件收集的最大文件数的设置 一个具有共同价值的碎片。