bigywater.tech
Elasticsearch · 78

composite 聚合分页

真实用1000种(cat,sub)组合验证composite聚合通过after_key游标实现完整、安全的聚合桶翻页,去重后数量精确无误,并确认该游标机制与search_after用排序值定位的真实原理一致。

1000种(cat,sub)组合翻页
真实翻了11次,去重后精确1000条无重复无遗漏
after_key结构
真实精确等于上一页最后一个桶的key
search.max_buckets默认65536
真实composite通过size+after分批规避熔断

做的事:真实索引1000种不重复的(cat,sub)组合,用composite聚合size=100逐页翻取全部组合

代码真实索引1000条文档: cat0到cat49,各自搭配sub0到sub19,真实组合出1000种不重复的(cat,sub)二元组 POST /comp_agg/_search {"size":0,"aggs":{"c":{"composite":{ "size":100,"sources":[{"cat":{"terms":{"field":"cat"}}},{"sub":{"terms":{"field":"sub"}}}] }}}} 真实循环发起请求,每次把上一页的after_key真实带进下一次请求的after参数里

验证:真实循环了11次才取完全部数据,去重后收集到的组合数真实精确等于1000,一条不多一条不少

实测 · 本机 Elasticsearch 8.15.0 执行输出
真实翻页结果:
→ pages fetched: 11   (10页满数据各100条 + 最后1页返回空桶作为终止信号)
→ total combos collected: 1000
→ unique combos collected: 1000   ← 真实去重后数量没变,证明没有重复也没有遗漏

这组真实结果验证了composite聚合真正解决的问题:本系列第50、51篇验证过的from+size和search_after都是针对普通查询命中结果的深分页方案,但聚合桶(尤其是多个字段组合出的高基数桶)同样存在"数据量太大一次取不完"的真实需求——composite聚合真实提供了跟search_after类似的游标机制:每一页返回的结果里都带着一个after_key,下一次请求把这个值真实原样传回after参数,就能真实从上一页结束的地方精确继续,直到某一页真实返回空桶列表,标志着全部数据已经取完。本次实测1000种组合、每页100条,真实翻了10页满数据,第11页真实返回空桶作为终止信号,全程没有发生任何重复或遗漏。

真实查看after_key本身的结构,确认它真实是按sources里声明的字段顺序编码的真实游标值

代码POST /comp_agg/_search {"size":0,"aggs":{"c":{"composite":{"size":5, "sources":[{"cat":{"terms":{"field":"cat"}}},{"sub":{"terms":{"field":"sub"}}}] }}}}

验证:after_key真实是一个跟桶key结构完全一致的对象,直接取自上一页最后一个桶

实测 · 本机执行输出
size=5这一页的桶: [{'cat':'cat0','sub':'sub0'}, {'cat':'cat0','sub':'sub1'},
  {'cat':'cat0','sub':'sub10'}, {'cat':'cat0','sub':'sub11'}, {'cat':'cat0','sub':'sub12'}]

after_key: {'cat':'cat0','sub':'sub12'}   ← 真实精确等于这一页最后一个桶的key
这组真实结果印证了composite聚合游标机制的具体实现:after_key真实不是一个独立编码的黑盒令牌,而是直接就是上一页最后一个桶的key——因为composite聚合的桶真实是按sources里声明的字段顺序排好序的(本次实测先按cat、再按sub字典序),下一页请求带上这个after之后,ES真实只需要定位到"排序意义上恰好在这个key之后"的下一批桶,这跟search_after用排序值做游标的真实原理一致,只是作用对象从普通文档换成了聚合桶。值得一提的是本次观察到集群的search.max_buckets默认值真实是65536——如果真实用传统的terms嵌套terms这种写法去枚举高基数组合,一次性返回的桶总数超过这个上限会真实触发熔断报错;而composite聚合通过size参数把每次返回的桶数量真实控制在一个可控范围内,配合after游标分批取完,正是为了在真实面对远超这个上限的高基数组合场景时依然能够完整、安全地遍历全部数据。

分步演示:composite聚合从完整翻页验证到after_key游标结构的完整过程

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

composite聚合用after_key游标真实实现了聚合桶的完整安全翻页
这一步新验证的composite特性

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 composite 聚合与 after 游标参数
    京ICP备2026067502号-1京公网安备11010502063487号