版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
ElasticSearch java api常用聚合查询
ES的java api:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().filter(“name”,name));
SearchRequestBuilder requestBuilder = this.esClient.prepareSearch(INDEX_NAME)
.setTypes(INDEX_TYPE)
.setQuery(boolQuery)
.addAggregation(AggregationBuilders.terms(“agg_name”).field(“name”))
.addAggregation(AggregationBuilders.terms("agg_salary").subAggregation(
AggregationBuilders.avg("total_salary").field("salary")
)
) //在es的api中,多字段上的聚合操作需要用到子聚合(subAggregation)
.setSize(0);
logger.debug(requestBuilder.toString());
SearchResponse response = requestBuilder.get();
if(response.status()==RestStatus.OK){
Terms terms = response.getAggregations().get(“agg_name”);
if(terms.getBuckets()!=null&&!terms.getBuckets().isEmpty()){
//得到所有子聚合
Map subaggmap =terms.getBucketByKey(district).getAggregations().asMap();
//avg值获取方法
double avg_age= ((InternalAvg) subaggmap.get("avg_age")).getValue();
//sum值获取方法
double total_salary = ((InternalSum) subaggmap.get("total_salary")).getValue();
//记录数
terms.getBucketByKey(district).getDocCount();
}
}else{
logger.warn("Failed to Aggregate for "+”agg_name”);
}
其他特殊聚合:
- 聚合后对Aggregation结果排序
TermsBuilder teamAgg= AggregationBuilders.terms("team").order(Order.aggregation("total_salary ", false);
- Aggregation结果条数的问题
默认情况下,search执行后,仅返回10条聚合结果,如果想反悔更多的结果,需要在构建TermsBuilder 时指定size:TermsBuilder teamAgg= AggregationBuilders.terms("team").size(15);
聚合操作主要是调用了SearchRequestBuilder的addAggregation方法,通常是传入一个TermsBuilder,子聚合调用TermsBuilder的subAggregation方法,可以添加的子聚合有TermsBuilder、SumBuilder、AvgBuilder、MaxBuilder、MinBuilder等常见的聚合操作。
从实现上来讲,SearchRequestBuilder在内部保持了一个私有的 SearchSourceBuilder实例, SearchSourceBuilder内部包含一个List,每次调用addAggregation时会调用 SearchSourceBuilder实例,添加一个AggregationBuilder。
同样的,TermsBuilder也在内部保持了一个List,调用addAggregation方法(来自父类addAggregation)时会添加一个AggregationBuilder。