首页/数据/NoSQL 速查/composite 聚合分页遍历全部桶
Elasticsearch89 条

composite 聚合分页遍历全部桶

composite 聚合把多个维度组合成分页游标:单次返回 size 个桶与 after_key,循环请求可完整遍历所有桶组合,适合对全量维度做导出式统计。

NoSQL 速查数据更新于 2026-10-13

composite 聚合是什么

composite 聚合把多个维度组合成分页游标:一次请求返回 size 个桶与 after_key,把它作为下一次请求的 after 值继续翻页,直到响应里不再出现 after_key 为止。它是唯一能可靠遍历全部桶组合的分页聚合方式,适合对全量维度做导出式统计(例如按天与状态生成报表数据),而不是用来做交互式翻页。普通 terms 聚合默认只返回有限个桶,需要完整取值时就得靠它。

基本信息

结构sources 数组按顺序组合多个 terms / date_histogram / histogram 维度
翻页响应里的 after_key 作为下一次请求的 after 值
结束条件响应不再包含 after_key
size每页返回的桶数
一致性并发写入时两次翻页之间的数据可能变化
所属系统Elasticsearch(各主要版本均支持)

典型使用场景

  • 全量维度导出:把日期与状态的组合逐页取完并写入数据仓库
  • 报表预处理:离线跑一遍生成聚合结果,前端读取时不再实时计算
  • 突破桶数限制:需要某字段全部取值时替代默认截断的 terms 聚合
  • 对账校验:用完整桶集合与另一套统计逐项比对差异
  • 补全维度:拿到完整组合后在应用侧补零,折线图不会出现断点

请求与翻页

请求与翻页
GET /logs/_search
{
  "size": 0,
  "aggs": {
    "combos": {
      "composite": {
        "size": 1000,
        "sources": [
          { "dt": { "date_histogram": { "field": "@timestamp", "calendar_interval": "day" } } },
          { "status": { "terms": { "field": "status" } } }
        ]
      }
    }
  }
}
# 下一页:请求体结构不变,把响应里的 after_key 原样填进 after
# "after": { "dt": 1719792000000, "status": "open" }

参数读法

项含义注意
sources维度列表顺序决定输出键的顺序
size每页桶数调大减少往返,但单页更重
after_key下一页游标原样回填,字段名与顺序要一致
after翻页参数键名必须与 sources 中的名字对应
无 after_key遍历结束循环终止条件就看这个
composite 返回的桶是完整集合,遍历结束后可以入库再做二次加工;它和普通 terms 聚合不同,不存在「只返回前 N 个桶」的截断问题。
两次翻页之间如果有新数据写入,结果可能出现重复或遗漏。需要严格一致口径时配合 PIT(point in time)固定快照再遍历。

易错点

  • after 的字段名必须与 sources 中的名字完全一致,顺序也要对应,写错会直接报解析错误
  • 并发写入时两次翻页之间数据可能变化,严格一致口径需配合 PIT
  • 把 composite 当交互式分页用:它不支持跳页也不返回总量,前端翻页仍要用 from/size 或 search_after
  • size 设得过大(几万)会让单次请求变慢甚至超时,按实际桶宽度定在千级更稳

数据来源与参考

  • Elasticsearch Guide: Composite aggregation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌