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)固定快照再遍历。