真实用1000种(cat,sub)组合验证composite聚合通过after_key游标实现完整、安全的聚合桶翻页,去重后数量精确无误,并确认该游标机制与search_after用排序值定位的真实原理一致。
代码真实索引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参数里
真实翻页结果: → 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页真实返回空桶作为终止信号,全程没有发生任何重复或遗漏。
代码POST /comp_agg/_search {"size":0,"aggs":{"c":{"composite":{"size":5, "sources":[{"cat":{"terms":{"field":"cat"}}},{"sub":{"terms":{"field":"sub"}}}] }}}}
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每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
composite 聚合与 after 游标参数