GET food/_search
{
"size": 0,
"aggs": {
"type_bucket": {
//首先按照Type字段进行分桶
"terms": {
"field": "Type.keyword"
},
//因为要计算各个分桶的平均值,所以在分桶的基础上做指标聚合
"aggs": {
"price_bucket": {
"avg": {
"field": "Price"
}
}
}
},
//这里通过buckets_path实现查找平均值最低的食物分类的桶
"min_bucket":{
"min_bucket": {
"buckets_path": "type_bucket>price_bucket"
}
}
}
}'
es管道二次聚合查询转java
SearchRequest searchRequest = new SearchRequest("food");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(0);
TermsAggregationBuilder typeBucket = AggregationBuilders.terms("type_bucket").field("Type.keyword");
TermsAggregationBuilder levelBucket = AggregationBuilders.terms("level_bucket").field("Level.keyword");
AvgAggregationBuilder priceAvg = AggregationBuilders.avg("price_avg").field("Price");
AvgBucketPipelineAggregationBuilder seller_num_agg_av = new AvgBucketPipelineAggregationBuilder("min_leve_bucket", "level_bucket>price_avg");
levelBucket.subAggregation(priceAvg);
typeBucket.subAggregation(levelBucket);
typeBucket.subAggregation(seller_num_agg_av);
searchSourceBuilder.aggregation(typeBucket);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregation type_bucket = searchResponse.getAggregations().get("type_bucket");
Terms.Bucket bucket = ((ParsedStringTerms) type_bucket).getBuckets().get(0);
ParsedStringTerms level_bucket = bucket.getAggregations().get("level_bucket");
Terms.Bucket bucket1 = level_bucket.getBuckets().get(0);