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());
        }

    }

实现效果如下:

相关推荐
秦南北21 分钟前
国内领先的宠物类电商代运营公司品融电商
大数据·人工智能·电商
problc2 小时前
Manus AI 全球首款通用型 Agent,中国制造
大数据·人工智能·制造
*星星之火*5 小时前
【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计
大数据·架构·flink
黑客KKKing6 小时前
Refreshtoken 前端 安全 前端安全方面
大数据·前端·网络·安全·web安全
永洪科技6 小时前
共绘智慧升级,看永洪科技助力由由集团起航智慧征途
大数据·数据分析·数据可视化·bi
好记性+烂笔头6 小时前
Hadoop八股
大数据·hadoop·分布式
Python数据分析与机器学习6 小时前
《基于Hadoop的出租车需求预测系统设计与实现》开题报告
大数据·hadoop·分布式·python·算法·数据挖掘·数据分析
StableAndCalm6 小时前
什么是hadoop
大数据·hadoop·分布式
麻芝汤圆6 小时前
在虚拟机上安装 Hadoop 全攻略
大数据·linux·服务器·hadoop·windows·分布式
lqlj22336 小时前
第一个Hadoop程序
大数据·hadoop·分布式