java中addrange_java elasticsearch 桶聚合(bucket)
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)相关推荐
- ElasticSearch中什么是桶(bucket)?什么是度量(metrics)?
什么是桶(bucket)?什么是度量(metrics)? 桶,是按照某种方式对数据进行分组,每一组数据在ES中称为一个桶,例如我们根据国籍对人划分,可以得到中国桶.英国桶,日本桶--或者我们按照年 ...
- java中使用ElasticSearch聚合查询代码实例(个人笔记,不喜勿喷)
PS→无奈:拥有梦想只是一种智力,实现梦想才是一种能力. 空闲之余就把先前做过的一个通过ElasticSearch的聚合来实现查询当月实际签到的天数记录一下,纯留下点记忆,大家勿喷. 1.如果不了解e ...
- Java中的组合、聚合和关联关系
1.介绍 对象之间在现实生活和编程中都有关系.有时很难理解或实现这些关系. 在本教程中,我们将重点介绍 Java 的三种关系类型,这些关系有时很容易混合:组合.聚合和关联. 2.组合 组成是一种&qu ...
- Java中使用MongoTemplate写聚合函数样例
mongo shell 语句 db.activity_service_log.aggregate([{$match: {"date": "2020-11-02" ...
- es java 删除索引_使用java中的elasticSearch 2.3.3按索引名称和类型删除索引
我在java中有一个项目,我使用弹性搜索2.3.3索引数据.索引有两种类型. 我的索引文档看起来像: { "took": 10,"timed_out": fal ...
- Elasticsearch教程(6) ES桶聚合Query DSL-Terms Aggregation
Elasticsearch 桶聚合 Terms Aggregation 1 准备测试数据 1.1 插入数据DSL 1.2 表格展示 2 Terms Aggregation(根据字段的值分组) 2.1 ...
- ES聚合查询详解(二):桶聚合
前言 前面介绍了ES的简单使用,并说明了ES聚合查询主要分为3类:指标聚合.桶聚合和管道聚合. 本文主要是介绍其中桶聚合的相关使用. 一.桶聚合 Bucket 聚合不像Metric聚合那样计算字段上的 ...
- 深入理解Java中的逃逸分析
转载自 深入理解Java中的逃逸分析 在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译 ...
- Java - 深入理解Java中的逃逸分析
在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译是把.class转换成机器指令的过程. ...
最新文章
- 斯坦福的人工智能4年路线!
- 智能驾驶继续突破,国内国外技术进入深水区
- [PHP 安全] pcc —— PHP 安全配置检测工具
- 2018CHD-ACM新生赛(正式赛)E.解救迷茫的草滩小王子
- 基于TCP和多线程实现无线鼠标键盘-Socket(1)
- linux安装之后缺少命令,CentOS7安装成功后缺少命令的解决办法
- JSJQuery必备技能
- IIS 7 配置备份和还原
- 计算机毕业论文数据挖掘,数据挖掘论文范文
- 阿里云实现首个云上量子加密通讯服务
- CCC认证和CQC认证的区别有哪些
- 在c语言中的变量分为三种类型,在C语言中的实型变量分为两种类型
- 工商银行近20年实时大数据平台建设历程
- 我的第一篇博客--成长的第一站
- android原生组件,RN原生的安卓UI组件
- scala spark sql 获得分组后的分位点
- python selenuim自动签到京东网页版
- 前端小动画之飘落的小雪花
- qpython3手机版turtle_Python的画图模块turtle使用详解
- python 微服务架构_Python微服务架构chili_chicken
热门文章
- GPT免费网站分享(持续更新)
- python grid函数_Python – matplotlib griddata的多处理器
- Curl安装测试http3——openssl+nghttp3+ngtcp2+curl
- 分卷文件:C:\GameDownload\LOL_v*****_FULL.7z.001损坏,请检查后重试
- 华北科技学院宿舍楼开始装空调啦!
- [生信]biomaRt 基因ID的转换
- 宽带和流量是分开的吗_流量和宽带有什么区别-流量和宽带有什么区别?哪个划算?-综投网...
- google paly过审问题汇总
- 51单片机+L293D控制直流电机起保停正反转
- (网络速度)电信拉的100M光纤,测试峰值速度只有12M/s