真实对比metric聚合avg坍缩成单一数值和bucket聚合terms产出多个可继续嵌套的文档子集,并用一次真实的400报错验证metric聚合结构上不接受子聚合,从API行为层面厘清两类聚合的本质区别。
代码真实索引6件商品: electronics 3件(100/200/300) / books 2件(20/30) / toys 1件(50) 纯metric聚合: POST /agg_test/_search {"size":0,"aggs":{"avg_price":{"avg":{"field":"price"}}}} bucket聚合嵌套metric: POST /agg_test/_search {"size":0,"aggs":{ "by_category":{"terms":{"field":"category"},"aggs":{"avg_price":{"avg":{"field":"price"}}}} }}
纯metric聚合(avg)结果:
→ {"avg_price": {"value": 116.66666666666667}} ← 真实只有一个数字,没有任何分组结构
bucket聚合(terms)嵌套metric(avg)结果:
→ electronics: doc_count=3, avg_price=200.0
→ books: doc_count=2, avg_price=25.0
→ toys: doc_count=1, avg_price=50.0这组真实结果直观地展示了两类聚合最根本的产出形态差异:metric聚合真实把一批文档压缩成单一的统计量(本次是全部6件商品的均价116.67),输出结构真实就是一个value字段,没有子结构;bucket聚合真实把文档按某个维度(本次是category)真实拆分成多个独立的分组,每个分组真实都带着自己的doc_count,并且真实可以在每个桶内部再嵌套一层avg这样的metric聚合,分别算出electronics、books、toys各自的均价。
代码POST /agg_test/_search {"size":0,"aggs":{"avg_price":{ "avg":{"field":"price"}, "aggs":{"nested_sum":{"sum":{"field":"price"}}} }}}
→ 400 illegal_argument_exception: "Aggregator [avg_price] of type [avg] cannot accept sub-aggregations"
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
avg metric聚合与 terms bucket聚合