Elasticsearch中如何对type为1或2的桶执行Sum Bucket聚合?
解决方案:仅计算指定type桶的my_sum总和
没问题!这在Elasticsearch里完全可以实现,给你两种实用的方案,根据你的具体场景来选择:
方案1:直接限定分桶的type值(简洁高效)
如果不需要保留其他type的分桶,只需要计算type=1和type=2的总和,最直接的方式是在terms聚合中通过include参数限定只生成目标type的桶,后续的sum_bucket就会自动只对这些桶的my_sum求和。
修改后的聚合语句如下:
{ "aggs": { "types": { "terms": { "field": "type", "include": [1, 2] // 若type是字符串类型,改为["1", "2"] }, "aggs": { "my_sum": { "sum": { "field": "price" } } } }, "filtered_total_sum": { "sum_bucket": { "buckets_path": "types.my_sum" } } } }
说明
include参数会过滤terms聚合的结果,只保留key为1和2的桶- 后续的
sum_bucket会直接对这些过滤后的桶的my_sum值求和,完全符合你的需求 - 注意匹配
type字段的数据类型:数值类型用[1,2],字符串类型用["1","2"]
方案2:保留全部分桶,同时计算目标type的总和(灵活场景)
如果需要保留所有type的分桶数据,同时额外计算type=1和type=2的总和,可以结合bucket_script和sum_bucket的过滤功能实现:
{ "aggs": { "types": { "terms": { "field": "type" }, "aggs": { "my_sum": { "sum": { "field": "price" } }, // 标记当前桶是否为目标type "is_target_type": { "bucket_script": { "script": "params.key == 1 || params.key == 2", "params": { "key": "_key" } } } } }, // 仅对标记为目标type的桶求和 "filtered_total_sum": { "sum_bucket": { "buckets_path": "types.my_sum", "gap_policy": "skip", "filter": { "bucket_selector": { "buckets_path": { "isTarget": "types.is_target_type" }, "script": "params.isTarget" } } } } } }
说明
- 先通过
bucket_script给每个桶添加一个标记字段is_target_type,判断当前桶的key是否为1或2 - 再在
sum_bucket中通过filter参数,只选择is_target_type为true的桶进行求和 - 这种方式既保留了所有type的分桶数据,又能得到目标type的总和
内容的提问来源于stack exchange,提问作者V V
相关产品推荐
相关产品推荐

