zoukankan      html  css  js  c++  java
  • java Elasticsearch 进行嵌套子聚合

    聚合子查询:

    TermsAggregationBuilder aggregation = AggregationBuilders.terms("dt_id").field("dt_ids").size(30000);
            String agg_area_field = "city_code";
            TermsAggregationBuilder area_field_builder = AggregationBuilders.terms("area_field").field(agg_area_field).size(30000);
            area_field_builder.subAggregation(aggregation);
            SearchResponse response = client.prepareSearch(index_name).setTypes("lw_devices")
                    .setQuery(boolQuery)
                    .addAggregation(area_field_builder)
                    .execute()
                    .actionGet();

    以上demo的大致的意思就是,先对city_code字段进行聚合,然后对聚合结果,再用dt_ids字段进行嵌套聚合(子聚合) , 相当于sql的两个group by , 一个聚合嵌套于另一个聚合之内,可以用subAggregation方法进行关联。

    然后就是对聚合结果的遍历:

            Terms terms = response.getAggregations().get("area_field");
            List<Terms.Bucket> buckets = terms.getBuckets();for (Terms.Bucket bucket : buckets) {
                //地区
                String code = (String) bucket.getKey();
                System.out.println(code);
                Aggregations aggregations = bucket.getAggregations();
                Terms dt_id = aggregations.get("dt_id");
                List<Terms.Bucket> buckets1 = dt_id.getBuckets();
                for (Terms.Bucket bucket1 : buckets1) {
                    System.out.println(bucket1.getKey() + ":" + bucket1.getDocCount());
                }
            }

    思路就是,先根据response拿到aggregation,然后根据标识符拿到对应的,聚合类型,然后得到bucket的集合。然后再通过bucket拿到aggregation, 然后以此循环往下提取聚合结果。

  • 相关阅读:
    Solution 16: 树的层次遍历
    Solution 15: 树的镜像
    Solution 14: Two Sum
    Solution 13: 链表的倒数第K个节点
    Solution 10: 翻转句子中的单词
    Solution 11: 二叉树中节点的最大距离
    Solution 9: 判断序列是否为BST的后续遍历结果
    Solution 7: 判断两链表是否相交
    估算Baidu和Google的网页索引数量之比
    主元素问题
  • 原文地址:https://www.cnblogs.com/chenmz1995/p/11583915.html
Copyright © 2011-2022 走看看