在sum聚合运算时会有两个值sum之后相除的运算方式sum(A)/sum(B),这就需要用到es的Bucket ScriptAggregation聚合方式。
备注:由于这个问题是一年之前遇到的,现在的新版ES应该有细微变化了,具体的可能需要重测试,但是评论区有人给出了新版的方法,可以尝试一下。
"aggregations" : {
"A" : {
"sum" : {
"field" : "A"
}
},
"B" : {
"sum" : {
"field" : "B"
}
},
"(A/B)" : {
"bucket_script" : {
"script" : {
"inline" : "tmpA/tmpB"
},
"buckets_path" : {
"tmpA" : "A",
"tmpB" : "B"
}
}
}
}
bucket_path字段是一个映射map,用别名映射A和B聚合的桶,然后再在script中做脚本运算,但是es不支持按照聚合生成字段“(A/B)”排序。
sum和bucket_script聚合都是管道聚合(Pipeline)
Pipeline Aggregations 是一组工作在其他聚合计算结果而不是文档集合的聚合。
有很多种不同类型的 Pipeline Aggregations ,不同的 Pipeline Aggregations 对其他聚合计算结果有不同的聚合计算。
总的来说 Pipeline Aggregations 有以下两种类型:
Pipeline Aggregations 是针对于其他聚合结果进行聚合计算的聚合,所以需要做到的一点是如何指出需要进行聚合计算的其他聚合。每个 Pipeline Aggregations 都会有一个buckets_path__参数,用于指定其他聚合。
Pipeline Aggregations 不可以具有子聚合,但是根据类型,可以通过 buckets_path 引用另一个 Pipeline Aggregations ,使管道聚合链接起来。