You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:30:57