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

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/lori/p/13595823.html
Copyright © 2011-2022 走看看