Elasticsearch桶聚合,目的就是数据分组,先将数据按指定的条件分成多个组,然后对每一个组进行统计。

不了解Elasticsearch桶聚合概念,可以先学习下Elasticsearch桶聚合教程

本章介绍java elasticsearch桶聚合的用法

例子

// 首先创建RestClient,后续章节通过RestClient对象进行参数配置。

RestClientBuilder restClientBuilder = RestClient.builder(

new HttpHost("localhost", 9200, "http"), // 设置ES服务地址,支持多个

new HttpHost("localhost", 9201, "http"));

// 创建RestHighLevelClient,请求都是通过RestHighLevelClient实例发出去的。

RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);

// 创建SearchRequest对象, 设置索引名=order

SearchRequest searchRequest = new SearchRequest("order");

// 通过SearchSourceBuilder构建搜索参数

SearchSourceBuilder builder = new SearchSourceBuilder();

// 通过QueryBuilders构建ES查询条件,这里查询所有文档,复杂的查询语句设置请参考前面的章节。

builder.query(QueryBuilders.matchAllQuery());

// 创建Terms桶聚合条件

// terms聚合命名为: by_shop, 分组字段为: shop_id

TermsAggregationBuilder byShop = AggregationBuilders.terms("by_shop")

.field("shop_id");

// 设置聚合条件

builder.aggregation(byShop);

// 设置搜索条件

searchRequest.source(builder);

// 执行ES请求

SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

// 处理聚合查询结果

Aggregations aggregations = searchResponse.getAggregations();

// 根据by_shop名字查询terms聚合结果

Terms byShopAggregation = aggregations.get("by_shop");

// 遍历terms聚合结果

for (Terms.Bucket bucket : byShopAggregation.getBuckets()) {

// 因为是根据shop_id分组,因此可以直接将桶的key转换成int类型

int shopId = bucket.getKeyAsNumber().intValue();

// 如果分组的字段是字符串类型,可以直接转成String类型

// String key = bucket.getKeyAsString();

// 获取文档总数

long count = bucket.getDocCount();

}

其他桶聚合条件的用法类型,下面分别介绍各类常用的桶聚合

常用桶聚合

1.Terms聚合

创建聚合条件

// terms聚合命名为: by_shop, 分组字段为: shop_id

TermsAggregationBuilder byShop = AggregationBuilders.terms("by_shop")

.field("shop_id");

处理聚合结果

Aggregations aggregations = searchResponse.getAggregations();

// 根据by_shop命名查询terms聚合结果

Terms byShopAggregation = aggregations.get("by_shop");

// 遍历terms聚合结果

for (Terms.Bucket bucket : byShopAggregation.getBuckets()) {

// 因为是根据shop_id分组,因此可以直接将桶的key转换成int类型

int shopId = bucket.getKeyAsNumber().intValue();

// 如果分组的字段是字符串类型,可以直接转成String类型

// String key = bucket.getKeyAsString();

// 获取文档总数

long count = bucket.getDocCount();

}

2.Histogram聚合

创建聚合条件

// Histogram聚合命名为: prices

HistogramAggregationBuilder histogramAggregationBuilder = AggregationBuilders.histogram("prices")

.field("price") // 根据price字段值,对数据进行分组

.interval(100); // 分桶的间隔为100,意思就是price字段值按100间隔分组

处理聚合结果

// 处理聚合查询结果

Aggregations aggregations = searchResponse.getAggregations();

// 根据prices命名查询Histogram聚合结果

Histogram histogram = aggregations.get("prices");

// 遍历聚合结果

for (Histogram.Bucket bucket : histogram.getBuckets()) {

// 获取桶的Key值

String key = bucket.getKeyAsString();

// 获取文档总数

long count = bucket.getDocCount();

}

3.Date histogram聚合

创建聚合条件

// DateHistogram聚合命名为: sales_over_time

DateHistogramAggregationBuilder dateHistogramAggregationBuilder = AggregationBuilders.dateHistogram("sales_over_time")

.field("date") // 根据date字段值,对数据进行分组

// 时间分组间隔:DateHistogramInterval.* 序列常量,支持每月,每年,每天等等时间间隔

.calendarInterval(DateHistogramInterval.MONTH)

// 设置返回结果中桶key的时间格式

.format("yyyy-MM-dd");

处理聚合结果

// 处理聚合查询结果

Aggregations aggregations = searchResponse.getAggregations();

// 根据sales_over_time命名查询Histogram聚合结果

Histogram histogram = aggregations.get("sales_over_time");

// 遍历聚合结果

for (Histogram.Bucket bucket : histogram.getBuckets()) {

// 获取桶的Key值

String key = bucket.getKeyAsString();

// 获取文档总数

long count = bucket.getDocCount();

}

4.Range聚合

创建聚合条件

//range聚合命名为: price_ranges

RangeAggregationBuilder rangeAggregationBuilder = AggregationBuilders.range("price_ranges")

.field("price") // 根据price字段分桶

.addUnboundedFrom(100) // 范围配置, 0 - 100

.addRange(100.0, 200.0) // 范围配置, 100 - 200

.addUnboundedTo(200.0); // 范围配置,> 200的值

处理聚合结果

// 处理聚合查询结果

Aggregations aggregations = searchResponse.getAggregations();

Range range = aggregations.get("price_ranges");

// 遍历聚合结果

for (Range.Bucket bucket : range.getBuckets()) {

// 获取桶的Key值

String key = bucket.getKeyAsString();

// 获取文档总数

long count = bucket.getDocCount();

}

5.嵌套聚合的用法

桶聚合之间支持互相嵌套,同时桶聚合也可以嵌套多个指标聚合,可以参考下面例子组合聚合条件

创建嵌套聚合条件

// 创建Terms指标聚合

TermsAggregationBuilder byShop = AggregationBuilders.terms("by_shop")

.field("shop_id");

// 创建avg指标聚合

AvgAggregationBuilder avgPriceBuilder = AggregationBuilders.avg("avg_price")

.field("price");

// 设置嵌套聚合查询条件

byShop.subAggregation(avgPriceBuilder);

SumAggregationBuilder sumPriceBulder = AggregationBuilders.sum("sum_price")

.field("price");

// 设置嵌套聚合查询条件

byShop.subAggregation(sumPriceBulder);

处理结果

// 处理聚合查询结果

Aggregations aggregations = searchResponse.getAggregations();

Terms terms = aggregations.get("by_shop");

// 遍历聚合结果

for (Terms.Bucket bucket : terms.getBuckets()) {

// 获取桶的Key值

String key = bucket.getKeyAsString();

// 获取文档总数

long count = bucket.getDocCount();

// 处理嵌套聚合结果

Aggregations subAggregations = bucket.getAggregations();

// 根据avg_price命名,查询avg聚合结果

Avg avgPriceResult = subAggregations.get("avg_price");

// 获取平均价格

double avgPrice = avgPriceResult.getValue();

// 根据sum_price命名,查询sum聚合结果

Sum sumPriceResult = subAggregations.get("sum_price");

// 获取总价格

double sumPrice = sumPriceResult.getValue();

}

java中addrange_java elasticsearch 桶聚合(bucket)相关推荐

  1. ElasticSearch中什么是桶(bucket)?什么是度量(metrics)?

    什么是桶(bucket)?什么是度量(metrics)? ​ 桶,是按照某种方式对数据进行分组,每一组数据在ES中称为一个桶,例如我们根据国籍对人划分,可以得到中国桶.英国桶,日本桶--或者我们按照年 ...

  2. java中使用ElasticSearch聚合查询代码实例(个人笔记,不喜勿喷)

    PS→无奈:拥有梦想只是一种智力,实现梦想才是一种能力. 空闲之余就把先前做过的一个通过ElasticSearch的聚合来实现查询当月实际签到的天数记录一下,纯留下点记忆,大家勿喷. 1.如果不了解e ...

  3. Java中的组合、聚合和关联关系

    1.介绍 对象之间在现实生活和编程中都有关系.有时很难理解或实现这些关系. 在本教程中,我们将重点介绍 Java 的三种关系类型,这些关系有时很容易混合:组合.聚合和关联. 2.组合 组成是一种&qu ...

  4. Java中使用MongoTemplate写聚合函数样例

    mongo shell 语句 db.activity_service_log.aggregate([{$match: {"date": "2020-11-02" ...

  5. es java 删除索引_使用java中的elasticSearch 2.3.3按索引名称和类型删除索引

    我在java中有一个项目,我使用弹性搜索2.3.3索引数据.索引有两种类型. 我的索引文档看起来像: { "took": 10,"timed_out": fal ...

  6. Elasticsearch教程(6) ES桶聚合Query DSL-Terms Aggregation

    Elasticsearch 桶聚合 Terms Aggregation 1 准备测试数据 1.1 插入数据DSL 1.2 表格展示 2 Terms Aggregation(根据字段的值分组) 2.1 ...

  7. ES聚合查询详解(二):桶聚合

    前言 前面介绍了ES的简单使用,并说明了ES聚合查询主要分为3类:指标聚合.桶聚合和管道聚合. 本文主要是介绍其中桶聚合的相关使用. 一.桶聚合 Bucket 聚合不像Metric聚合那样计算字段上的 ...

  8. 深入理解Java中的逃逸分析

    转载自  深入理解Java中的逃逸分析 在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译 ...

  9. Java - 深入理解Java中的逃逸分析

    在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译是把.class转换成机器指令的过程. ...

最新文章

  1. 斯坦福的人工智能4年路线!
  2. 智能驾驶继续突破,国内国外技术进入深水区
  3. [PHP 安全] pcc —— PHP 安全配置检测工具
  4. 2018CHD-ACM新生赛(正式赛)E.解救迷茫的草滩小王子
  5. 基于TCP和多线程实现无线鼠标键盘-Socket(1)
  6. linux安装之后缺少命令,CentOS7安装成功后缺少命令的解决办法
  7. JSJQuery必备技能
  8. IIS 7 配置备份和还原
  9. 计算机毕业论文数据挖掘,数据挖掘论文范文
  10. 阿里云实现首个云上量子加密通讯服务
  11. CCC认证和CQC认证的区别有哪些
  12. 在c语言中的变量分为三种类型,在C语言中的实型变量分为两种类型
  13. 工商银行近20年实时大数据平台建设历程
  14. 我的第一篇博客--成长的第一站
  15. android原生组件,RN原生的安卓UI组件
  16. scala spark sql 获得分组后的分位点
  17. python selenuim自动签到京东网页版
  18. 前端小动画之飘落的小雪花
  19. qpython3手机版turtle_Python的画图模块turtle使用详解
  20. python 微服务架构_Python微服务架构chili_chicken

热门文章

  1. GPT免费网站分享(持续更新)
  2. python grid函数_Python – matplotlib griddata的多处理器
  3. Curl安装测试http3——openssl+nghttp3+ngtcp2+curl
  4. 分卷文件:C:\GameDownload\LOL_v*****_FULL.7z.001损坏,请检查后重试
  5. 华北科技学院宿舍楼开始装空调啦!
  6. [生信]biomaRt 基因ID的转换
  7. 宽带和流量是分开的吗_流量和宽带有什么区别-流量和宽带有什么区别?哪个划算?-综投网...
  8. google paly过审问题汇总
  9. 51单片机+L293D控制直流电机起保停正反转
  10. (网络速度)电信拉的100M光纤,测试峰值速度只有12M/s