RestHighLevelClient进阶-聚合操作

时间:2020-10-23 20:42:36   收藏:0   阅读:963

之前的博客写过Spring与RestHighLevelClient的基础用法,但是实际使用中,会存在大量的复杂操作,如分组,聚合等。

接下来我们就来看下不太好用的分组聚合基本用法

AggregationBuilder

在使用上还是和之前的大致一样,

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 以batchId为分组条件,terms为分组后的字段名称,field为将被分组的字段名称
TermsAggregationBuilder aggregation = AggregationBuilders.terms("batchId").field("batchId.keyword")
	// 分组求和integral字段,并将求和后的字段名改为score
	// subAggregation为子聚合,即在batchId分组后的小组内聚合
	.subAggregation(AggregationBuilders.sum("score").field("integral"))
	// 注意这里,下面介绍
	.subAggregation(AggregationBuilders.topHits("details").size(1));

sourceBuilder.aggregation(aggregation);

BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
sourceBuilder.query(boolBuilder);

SearchRequest searchRequest = new SearchRequest("table");
searchRequest.source(sourceBuilder);

SearchResponse search = client.search(searchRequest);
// 和之前不同的是这里需要getAggregations获取聚合后的数据
Aggregations aggregations = search.getAggregations();
// 从分组后的数据中拿到batchId的数据,这里以batchId分组,则分组后的数据都在batchId里
ParsedStringTerms terms = aggregations.get("batchId");
// 获取到分组后的所有bucket
List<? extends Terms.Bucket> buckets = terms.getBuckets();

for (Terms.Bucket bucket : buckets) {
	// 解析bucket 因为一级聚合为以batchId分组,二级聚合为求和,所以这里还需要getAggregations获取求和的数据
	Aggregations bucketAggregations = bucket.getAggregations();
	// 这里我是通过debug才找到返回的参数类型的,我不知道在哪找得到这个东西,所以我们拿到了ParsedTopHits,这里我们是取了一个,所以这个值的数组长度为1
	ParsedTopHits topHits = bucketAggregations.get("details");
	// 因为求和和下面的topHits都是AggregationBuilders.terms("batchId").field("batchId.keyword")的subAggreation,所以都属于batchId组内
	// 获取到求和的数据信息
	ParsedSum sum = bucketAggregations.get("integral");
	// 因为topHits中命中的hits肯定至少有一个,要不然也不会成组,所以这里直接获取第一个,并解析成map
	Map<String, Object> sourceAsMap = topHits.getHits().getHits()[0].getSourceAsMap();
	// 将求和后的integral覆盖到原数据中
	sourceAsMap.put("integral", sum.value());
	// 打印出统计后的数据
	System.out.println(sourceAsMap);
}

注意点:

  1. 为什么要用subAggregation(AggregationBuilders.topHits("details").size(1))?
  1. AggregationBuilders层级
TermsAggregationBuilder aggregation = AggregationBuilders.terms("batchId").field("batchId.keyword")
	.subAggregation(
			AggregationBuilders.terms("folder").field("folder")
					.subAggregation(AggregationBuilders.sum("integral").field("integral"))
);

结尾

原文:https://www.cnblogs.com/heyouxin/p/13865293.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!