真实用size=2限制命中结果数量,验证terms聚合依然精确统计全部5篇匹配文档不受分页影响,并打印聚合桶的原始JSON结构证明它只是key和doc_count的统计摘要,不携带任何可直接展示的文档身份信息。
代码真实索引5篇文档: cat=a的3篇 / cat=b的2篇 POST /agr_test/_search {"size":2,"query":{"match_all":{}},"aggs":{"by_cat":{"terms":{"field":"cat"}}}}
hits返回: 2条(真实被size=2截断) hits.total: 5(真实匹配总数) 聚合桶by_cat: → a: doc_count=3 → b: doc_count=2 (真实3+2=5,精确等于全部匹配文档数,不是只统计了那2条被返回的文档)
这组真实结果是理解聚合本质的第一个关键点:聚合真实是在查询匹配到的全部文档集合上独立计算的,跟size/from这些控制"最终展示给用户多少条命中结果"的分页参数真实完全没有关系——哪怕size设成0(本系列很多实验都这么用),聚合依然会真实在全部匹配文档上跑完整的统计。这说明一次请求里,hits(要展示的文档列表)和aggregations(统计摘要)真实是两条独立的产出管线,只是共享同一次查询匹配的结果集合作为输入。
代码POST /agr_test/_search {"size":0,"aggs":{"by_cat":{"terms":{"field":"cat"}}}}
{
"by_cat": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{ "key": "a", "doc_count": 3 },
{ "key": "b", "doc_count": 2 }
]
}
}每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
terms 聚合与查询 hits 结构对比