如何在Elasticsearch中对聚合结果执行二次聚合?
Elasticsearch二次聚合:统计聚合桶的doc_count出现次数
已完成按userId.keyword的聚合,得到每个用户对应的文档数,现在需要基于这些聚合桶的doc_count值,统计相同文档数的出现次数(例如有2个用户的文档数都是76,最终要统计为key=76、doc_count=2)。
实现查询DSL
GET /dailyactiveindex-*/_search { "query": { "match_all": {} }, "size": 0, "aggs": { "group_by_uid": { "terms": { "field": "userId.keyword", "size": 1000 // 按需调整,确保覆盖所有需要统计的用户桶 } }, "count_doc_counts": { "bucket_terms": { "buckets_path": "group_by_uid>doc_count", "size": 10 } } } }
关键逻辑说明
- 第一层聚合
group_by_uid:按用户ID分组,得到每个用户的文档数量,size参数需根据实际数据量调整,避免遗漏用户桶。 - 第二层聚合
count_doc_counts:使用管道聚合(bucket_terms),通过buckets_path指定要处理父聚合group_by_uid中的doc_count字段,对这些数值进行分组统计,最终得到每个文档数对应的用户数量。
预期结果
{ "took": 3, "timed_out": false, "_shards": { "total": 35, "successful": 35, "skipped": 0, "failed": 0 }, "hits": { "total": 864, "max_score": 0.0, "hits": [] }, "aggregations": { "group_by_uid": { ... }, "count_doc_counts": { "buckets": [ {"key": 110, "doc_count": 1}, {"key": 100, "doc_count": 1}, {"key": 76, "doc_count": 2}, {"key": 56, "doc_count": 1}, {"key": 52, "doc_count": 1}, {"key": 46, "doc_count": 1}, {"key": 45, "doc_count": 1}, {"key": 42, "doc_count": 1}, {"key": 21, "doc_count": 1} ] } } }
注意事项
bucket_terms管道聚合要求Elasticsearch版本在6.4及以上。- 如果父聚合的
sum_other_doc_count值不为0,说明有部分用户桶未被返回,需调大group_by_uid的size参数,否则这部分桶的doc_count不会被纳入二次聚合统计。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

