上面链接是官方文档对于父子文档的聚合示例,解释还是很清楚的。
下是我自己根据官网进行的聚合(就不提供数据了,只是我的模仿而已)
/*
* ******************************* 此处ES查询语句形如 **************************************/
GET company_info/_search
{
"size": 0,
"aggregations": {
"top_district":{
"terms": {
"field": "districtName"
} ,
"aggs": {
"to-person": {
"children": {
"type": "person"
} ,
"aggs": {
"per_state": {
"terms": {
"field": "personCerts"
}
}
}
}
}
}
}
}
结果,为了一张截图展示更多,对部分结果做了折叠处理,折叠部分和下面未折叠部分数据格式一致。
Java 父子聚合用到的是
具体代码如下
public Map<String,List<Map<String,Long>>> aggregationDistrictPerson() throws Exception {
TermsAggregationBuilder perStats = AggregationBuilders.terms("per_state").field("personCerts").size(10);
//这句就是针对子文档的聚合了
ChildrenAggregationBuilder childrenAggregation = JoinAggregationBuilders.children("to-person","person").subAggregation(perStats) ;
TermsAggregationBuilder districtStats = AggregationBuilders.terms("top_district").field("districtName").subAggregation(childrenAggregation) ;
Aggregations aggregations = esSearchService.aggregate(districtStats,matchAllQuery(),ES_INDEX);
Map<String, Aggregation> aggMap = aggregations.asMap();
Terms termAgg = (Terms) aggMap.get("top_district");
List<? extends Terms.Bucket> buckets = termAgg.getBuckets();
Map<String,List<Map<String,Long>>> resultMap = new HashMap<>();
buckets.forEach(bucket -> {
List<Map<String,Long>> listMap = new ArrayList<>();
Aggregations bucketAggregations = bucket.getAggregations();
Map<String, Aggregation> aggregationMap = bucketAggregations.asMap() ;
ParsedChildren toPerson = (ParsedChildren) aggregationMap.get("to-person");
Aggregations termAggregations = toPerson.getAggregations();
Map<String, Aggregation> termAggregationMap = termAggregations.asMap() ;
Terms perState = (Terms) termAggregationMap.get("per_state");
List<? extends Terms.Bucket> perStateBuckets = perState.getBuckets();
Map<String,Long> tbMap = new HashMap<>();
perStateBuckets.forEach(tb->tbMap.put(tb.getKey().toString(),tb.getDocCount()));
listMap.add(tbMap);
resultMap.put(bucket.getKey().toString(),listMap);
});
log.info(buckets);
log.info(aggregations);
return resultMap ;
}
整理后,结果形如