如何计算ELK中存款与取款聚合总和的差值?
问题:计算DEPOSIT与WITHDRAW的value总和差值
场景说明
索引文档结构示例:
id:1 type: Deposit value:12 timestamp:2022.10.09T00.00.00 #### id:2 type: withdraw value:15 timestamp:2022.10.9T00.00.00 #### id:3 type: Deposit value:17 timestamp:2022.10.09T11.00.00 ....
之前执行的聚合查询:
"aggs": { "s1": { "terms": { "field": "type", "size": 10 }, "aggs": { "SUM": { "sum": { "field": "value" } } } } }
返回结果:
"buckets" : [ { "key" : "DEPOSIT", "doc_count" : 9, "SO" : { "value" : 78983 } }, { "key" : "WITHDRAW", "doc_count" : 9, "SO" : { "value" : 777445 } } ]
解决方案
要计算DEPOSIT的value总和减去WITHDRAW的value总和,可以使用Elasticsearch的bucket_script聚合,它支持在已有聚合的buckets基础上执行脚本运算。
完整查询语句如下:
{ "aggs": { "s1": { "terms": { "field": "type", "size": 10 }, "aggs": { "SUM": { "sum": { "field": "value" } } } }, "deposit_minus_withdraw": { "bucket_script": { "buckets_path": { "depositSum": "s1['DEPOSIT'].SUM", "withdrawSum": "s1['WITHDRAW'].SUM" }, "script": "params.depositSum - params.withdrawSum" } } } }
关键说明
bucket_script作为顶级聚合,引用s1聚合下的两个目标bucket(DEPOSIT和WITHDRAW)的求和结果。buckets_path定义取值路径:s1['DEPOSIT'].SUM对应s1聚合中key为DEPOSIT的bucket下的SUM聚合值,s1['WITHDRAW'].SUM同理。script字段执行减法运算,直接返回两者的差值。
注意:要保证buckets_path中指定的key(DEPOSIT、WITHDRAW)与聚合结果中的key完全一致,需匹配字段的大小写或归一化规则。
内容的提问来源于stack exchange,提问作者Hanira Hanira
相关产品推荐
相关产品推荐

