SpringBoot知识体系(四)springboot整合Elasticsearch(5)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_37338761/article/details/102522769

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。

参考:ElasticSearch AggregationBuilders java api常用聚会查询

猜你喜欢

转载自blog.csdn.net/qq_37338761/article/details/102522769