zoukankan      html  css  js  c++  java
  • es~通过ElasticsearchTemplate进行聚合~嵌套聚合

    之前写过《es~通过ElasticsearchTemplate进行聚合操作》的文章,这一次主要写一个嵌套的聚合,例如先对sex集合,再对desc聚合,最后再对age求和,共三层嵌套。
    Aggregations的部分特性类似于SQL语言中的group by,avg,sum等函数,Aggregations需要理解两个概念:

    • 桶(Buckets):符合条件的文档的集合,相当于SQL中的group by。按“性别”聚合,一个人将被分到男桶或女桶
    • 指标(Metrics):基于Buckets的基础上进行统计分析,并进行计算,大多数metric是数学计算,仅输出一个值,min/max/avg/sum/cardinality,部分metric支持输出多个数值,stats(统计)/percentiles(百分比)/percentile_ranks

    嵌套聚合写法

     // 创建一个查询条件对象
            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() + "	" +
                            bucket.getDocCount() + "	" +
                            descTermsBucket.getKeyAsString() + "	" +
                            parsedSum.getValueAsString());
                }
            }
    

    结果
    1

    参考:https://www.elastic.co

  • 相关阅读:
    AJPFX关于集合的几种变量方式
    AJPFX关于java的依赖 关联 聚合的关系解释
    AJPFX对选择和冒泡两种排序的理解
    AJPFX总结抽象类和接口的区别
    AJPFX的内存管理小结
    AJPFX关于Java内部类及其实例化
    AJPFX总结String类的特点
    AJPFX简述Scanner类的特点
    监督学习——K邻近算法及数字识别实践
    对称(DES/AES)与非对称(RSA/SSL/数字证书)加密介绍及实际应用
  • 原文地址:https://www.cnblogs.com/lori/p/13595823.html
Copyright © 2011-2022 走看看