• es~通过ElasticsearchTemplate进行聚合~Nested嵌套聚合


    Nested是一种嵌套文档,类似于父子文档,它可以将与主文档有关的数据进行存储,可以把它理解成一张子表,它的查询和聚合性能很好;更新性能一般。

    下面是测试使用的数据结构,一个包含Nested属性的实体

    @Document(indexName = "esdto", type = "esdto")
    @Data
    @ToString(callSuper = true)
    @AllArgsConstructor
    @NoArgsConstructor
    public class TestEsDto extends EsBaseEntity implements Serializable {
    
    
        @Field(type = FieldType.Keyword)
        private String name;
        private Integer age;
        @Field(type = FieldType.Keyword)
        private String sex;
        @Field(type = FieldType.Keyword)
        private String desc;
        @Field(type = FieldType.Nested)
        private List<Person> personList;
    
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        @ToString
        public static class Person {
            private Integer age;
            @Field(type = FieldType.Keyword)
            private String sex;
            @Field(type = FieldType.Keyword)
            private String desc;
        }
    }
    

    存储的数据如图

    0

    聚合代码

      // 创建一个查询条件对象
            BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
            // 拼接查询条件
            queryBuilder.should(QueryBuilders.termQuery("creator", "1"));
    
            // 嵌套聚合
            AbstractAggregationBuilder aggregation =
                    AggregationBuilders
                        .nested("personList", "personList")
                        .subAggregation(AggregationBuilders
                            .terms("sex").field("personList.sex")
                            .subAggregation(
                                AggregationBuilders
                                    .terms("desc").field("personList.desc")
                                    .subAggregation(
                                        AggregationBuilders
                                                .sum("ageSum").field("personList.age")
                                    )
                            )
                        );
    
    
            // 创建查询对象
            SearchQuery build = new NativeSearchQueryBuilder()
                    .withQuery(queryBuilder) //添加查询条件
                    .addAggregation(aggregation) // 添加聚合条件
                    .withPageable(PageRequest.of(0, 1)) //符合查询条件的文档分页,如果文档比较大,可以把这个分页改小(不是聚合的分页)
                    .build();
            // 执行查询
            AggregatedPage<TestEsDto> testEntities = elasticsearchTemplate.queryForPage(build, TestEsDto.class);
    
            // 取出聚合结果
            Nested agg = testEntities.getAggregations().get("personList");
            Terms terms = agg.getAggregations().get("sex");
            // 遍历
            for (Terms.Bucket bucket : terms.getBuckets()) {
                Terms descTerms = bucket.getAggregations().get("desc");
                for (Terms.Bucket descTermsBucket : descTerms.getBuckets()) {
                    ParsedSum parsedSum = descTermsBucket.getAggregations().get("ageSum");//注意从bucket而不是searchResponse
                    System.out.println(bucket.getKeyAsString() + "	" +
                            bucket.getDocCount() + "	" +
                            descTermsBucket.getKeyAsString() + "	" +
                            parsedSum.getValueAsString());
                }
            }
    

    运行结果

    1

  • 相关阅读:
    【C#食谱】【风味小吃】菜单2:角度转换为弧度
    16 Rules for Managers
    word打不开,要在安全模式下才能打开
    禁止修改IP地址工具及原理
    VB编程读取本地计算机IP地址及MAC地址
    联想TinkCenter 8000T 安装XP需要修改CMOS
    使用nLite封装2003集成Raid卡驱动
    怎么样让台式机通过笔记本无线上网 台式机共享上网 笔记本当无线路由器 两台电脑一根网线
    VB使用ADODB操作数据库的常用方法
    转:[震惊] 这两天发现被穿的真正原因——QQ电脑管家
  • 原文地址:https://www.cnblogs.com/lori/p/13600545.html
Copyright © 2020-2023  润新知