如果你想把桶聚合结果也过滤一把,只返回满足你需要的桶,那么你应该使用ES的Pipeline aggregations -> bucket_selector
下面是连接:
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-aggregations-pipeline-bucket-selector-aggregation.html
标题下面是我的实践:
ES脚本
POST /sales/_search
{
"size": 100,
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"sales_bucket_filter": {
"bucket_selector": {
"buckets_path": {
"totalSales": "total_sales"
},
"script": "params.totalSales > 200"
}
}
}
}
这样得到的结果就是total_sales sum()聚合结果中大于 200的了。
Java代码
NativeSearchQueryBuilder aggSearchBuilder = new NativeSearchQueryBuilder();
aggSearchBuilder.withIndices("sales");
Map<String, String> bucketsPathsMap = new HashMap();
bucketsPathsMap.put("alarmCountTotalSales", "alarmCount_sum");
TermsAggregationBuilder termsAgg =
AggregationBuilders.sum("total_sales").field("price")
.subAggregation(PipelineAggregatorBuilders.bucketSelector("sum_bucket_filter1", bucketsPathsMap, new Script("params.alarmCountTotalSales > 0")));
aggSearchBuilder.addAggregation(termsAgg);
Aggregations aggregations = esRestTemplate.query(aggSearchBuilder.build(), SearchResponse::getAggregations);
// 解析聚合结果...
Terms terms = aggregations.get("total_sales");
更多聚合知识请看官网。