之前写过《es~通过ElasticsearchTemplate进行聚合操作》的文章,这一次主要写一个嵌套的聚合,例如先对sex集合,再对desc聚合,最后再对age求和,共三层嵌套。
Aggregations的部分特性类似于SQL语言中的group by,avg,sum等函数,Aggregations需要理解两个概念:
 // 创建一个查询条件对象
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        // 拼接查询条件
        queryBuilder.should(QueryBuilders.termQuery("creator", "1"));
        // 创建聚合查询条件
        TermsAggregationBuilder sexAgg = AggregationBuilders
                .terms("sex")
                .field("sex.keyword");//keyword表示不使用分词进行聚合,全字匹配
        TermsAggregationBuilder descAgg = AggregationBuilders
                .terms("desc")
                .field("desc.keyword");//keyword表示不使用分词进行聚合,全字匹配
        SumAggregationBuilder ageSumAgg = AggregationBuilders
                .sum("ageSum")
                .field("age");
        //嵌套
        descAgg.subAggregation(ageSumAgg);
        sexAgg.subAggregation(descAgg);
        // 创建查询对象
        SearchQuery build = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder) //添加查询条件
                .addAggregation(sexAgg) // 添加聚合条件
                .withPageable(PageRequest.of(0, 1)) //符合查询条件的文档分页,如果文档比较大,可以把这个分页改小(不是聚合的分页)
                .build();
        // 执行查询
        AggregatedPage<TestEsDto> testEntities = elasticsearchTemplate.queryForPage(build, TestEsDto.class);
        // 取出聚合结果
        Aggregations entitiesAggregations = testEntities.getAggregations();
        Terms terms = (Terms) entitiesAggregations.asMap().get("sex");
        // 遍历取出聚合字段列的值,与对应的数量
        for (Terms.Bucket bucket : terms.getBuckets()) {
            Terms descTerms = (Terms) bucket.getAggregations().asMap().get("desc");
            for (Terms.Bucket descTermsBucket : descTerms.getBuckets()) {
                ParsedSum parsedSum = descTermsBucket.getAggregations().get("ageSum");//注意从bucket而不是searchResponse
                System.out.println(bucket.getKeyAsString() + "\t" +
                        bucket.getDocCount() + "\t" +
                        descTermsBucket.getKeyAsString() + "\t" +
                        parsedSum.getValueAsString());
            }
        }
结果

es~通过ElasticsearchTemplate进行聚合~嵌套聚合
原文:https://www.cnblogs.com/lori/p/13595823.html