Elasticsearch:简化大数据分析,使用Elasticsearch进行高效数据聚合

目录

[DSL 实现数据聚合](#DSL 实现数据聚合)

Bucket聚合

带条件聚合

Metric聚合

[Java API 实现数据聚合](#Java API 实现数据聚合)

Bucket聚合

带条件聚合

metric聚合


聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。

DSL 实现数据聚合

Bucket聚合

场景:统计所有商品中共有哪些商品品牌,其实就是以品牌(brand)字段对数据分组。

java 复制代码
# bucket聚合
GET /items/_search
{
  "size": 0,
  "aggs": {
    "cate_aggs": {
      "terms": {
        "field": "brand",
        "size": 10
      }
    }
  }
}

实现效果如下:(对品牌进行分组)

带条件聚合

场景:查找按品牌(brand) 分组,且价格(price) 在(100,2000)的手机(name)

java 复制代码
# 带条件聚合
GET /items/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "name": "手机"
          }
        },
        {
          "range": {
            "price": {
              "gte": 10000,
              "lte": 2000000
            }
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "brand_agg": {
      "terms": {
        "field": "brand",
        "size": 10
      }
    }
  }
}

实现效果如下:

Metric聚合

场景:查找按照品牌分类的手机的价格的最小值、最大值、平均值。

java 复制代码
# metric聚合
GET /items/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "name": "手机"
          }
        }
      ]
    }
  },
  "size": 0,
  "aggs": {
    "brand_agg": {
      "terms": {
        "field": "category",
        "size": 10
      },
      "aggs": {
        "price_stats": {
          "stats": {
            "field": "price"
          }
        }
      }
    }
  }
}

实现效果如下:

Java API 实现数据聚合

Bucket聚合

java 复制代码
 /**
     * 聚合
     * @throws IOException
     */
    @Test
    void testAggs() throws IOException {
        // 1.创建Request
        SearchRequest request = new SearchRequest("items");
        // 2.组织请求参数
        // 2.1.query条件
        request.source().size(0);
        // 2.2.聚合条件
        String brandAggName = "brandAgg";
        request.source().aggregation(AggregationBuilders.terms(brandAggName).field("brand").size(5));
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        Aggregations aggregations = response.getAggregations();
        // 4.1.获取聚合结果
        Terms brandTerms = aggregations.get(brandAggName);
        // 4.2.获取buckets
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        // 4.3.遍历buckets
        for (Terms.Bucket bucket : buckets) {
            // 4.4.获取key,就是品牌名称
            String brand = bucket.getKeyAsString();
            // 4.5.获取doc_count,就是品牌对应的文档数量
            long docCount = bucket.getDocCount();
            System.out.println("品牌:" + brand + ",数量:" + docCount);
        }
    }

实现效果如下:

带条件聚合

java 复制代码
 /**
     * 带条件聚合查询
     * @throws IOException
     */
    @Test
    void testAggs() throws IOException {
        // 1.创建Request
        SearchRequest request = new SearchRequest("items");
        // 2.组织请求参数
        request.source().query(QueryBuilders.boolQuery()
                .must(QueryBuilders.matchQuery("name", "手机"))
                .filter(QueryBuilders.rangeQuery("price").lt(10000000))
        );
        // 2.1.聚合条件
        String brandAggName = "brandAgg";
        request.source().aggregation(AggregationBuilders.terms(brandAggName).field("brand").size(5));
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        Aggregations aggregations = response.getAggregations();
        // 4.1.获取聚合结果
        Terms brandTerms = aggregations.get(brandAggName);
        for (Terms.Bucket bucket : brandTerms.getBuckets()) {
            // 4.2.获取key,就是品牌名称
            String brand = bucket.getKeyAsString();
            // 4.3.获取doc_count,就是品牌对应的文档数量
            long docCount = bucket.getDocCount();
            System.out.println("品牌:" + brand + ",数量:" + docCount);
        }

    }

实现效果如下:

metric聚合

java 复制代码
  /**
     *  metric聚合
     * @throws IOException
     */
    @Test
    void testMetricAggs() throws IOException {
        // 1.创建Request
        SearchRequest request = new SearchRequest("items");
        // 2.组织请求参数
        request.source().query(QueryBuilders.boolQuery()
                .must(QueryBuilders.matchQuery("name", "手机"))
        );
        // 2.1.聚合条件
        String brandAggName = "brandAgg";
        request.source().aggregation(AggregationBuilders.terms(brandAggName).field("brand").size(5)
                .subAggregation(AggregationBuilders.avg("priceAvg").field("price"))
                .subAggregation(AggregationBuilders.max("priceMax").field("price"))
                .subAggregation(AggregationBuilders.min("priceMin").field("price"))
        );
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        Aggregations aggregations = response.getAggregations();
        // 4.1.获取聚合结果
        Terms brandTerms = aggregations.get(brandAggName);
        for (Terms.Bucket bucket : brandTerms.getBuckets()) {
            // 4.2.获取key,就是品牌名称
            String brand = bucket.getKeyAsString();
            // 4.3.获取doc_count,就是品牌对应的文档数量
            long docCount = bucket.getDocCount();
            // 4.4.获取子聚合结果
            Avg priceAvg = bucket.getAggregations().get("priceAvg");
            Max priceMax = bucket.getAggregations().get("priceMax");
            Min priceMin = bucket.getAggregations().get("priceMin");
            System.out.println("品牌:" + brand + ",数量:" + docCount + "," +
            "平均价格:" + priceAvg.getValue() + ",最高价格:" + priceMax.getValue() + ",最低价格:" + priceMin.getValue());
        }

    }

实现效果如下:

相关推荐
志栋智能2 小时前
超自动化安全:实现安全运营现代化的关键
大数据·运维·网络·安全·自动化
渣渣盟2 小时前
MySQL DDL操作全解析:从入门到精通,包含索引视图分区表等全操作解析
大数据·数据库·mysql
unclejet2 小时前
颠覆传统开发!AI根治软件工程技术债务顽疾
大数据·人工智能·软件工程
赴山海bi2 小时前
如何在不降低销量的情况下降低亚马逊ACOS
大数据
大大大大晴天️3 小时前
告别数据重复与丢失:Flink Exactly-Once 原理解析
大数据·flink
Ztopcloud极拓云视角3 小时前
Claude Opus 4.8 实战接入指南:动态工作流 + 思考投入控制深度使用
大数据·人工智能·gpt·claude·deepseek
hg01184 小时前
今年1至4月 厦门进出口超3000亿元
大数据
明航咨询—张老师4 小时前
软件工程造价师认证实战应用与职业价值指南
大数据·证书·软件工程·it
美林数据Tempodata4 小时前
从“建起来“到“用起来“:高校大数据实验室建设的系统性解法
大数据·大数据实训室·大数据实验室
云天AI实战派4 小时前
跨境出海工具链实战:用开源方案搭一套建站 + 订阅支付 + 数据看板 + 多语言 SEO 最小闭环
大数据·开源