{
“took” : 17,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 8,
“max_score” : 0.0,
“hits” : [ ]
},
“aggregations” : { —聚合结果
“price” : { —请求参数中指定的名称
“buckets” : [ —price桶的数据在此数组中
{
“key” : 0.0, —第一个区间[0-19999],0.0是起始值
“doc_count” : 3, —这个区间有三条记录(price值分别是10000、12000、15000)
“max_price” : { —指定的metrics结果名称
“value” : 15000.0 —桶中有三个文档,price字段的最大值是15000
},
“min_price” : {
“value” : 10000.0 —桶中有三个文档,price字段的最小值是10000
},
“avg_price” : {
“value” : 12333.333333333334 —桶中有三个文档,price字段的平均值是12333.333333333334
}
},
…
时间区间的桶(date_histogram)
- 按照时间区间聚合也是常用的功能,例如在ELK上查询日志,通常都是按照时间来分段的,如下图:
-
histogram桶可以实现按照时间分段么?如果用毫秒数来处理,似乎是可以的,但是对年月日的处理就力不从心了,常见的时间区间处理,用date_histogram桶即可满足要求;
-
下面就是date_histogram桶的用法:每月销售多少台汽车:
GET /cars/transactions/_search
{
“size”: 0, —令返回值的hits对象为空
“aggs”: { —聚合命令
“sales”: { —聚合字段名称
“date_histogram”: { —桶类型
“field”: “sold”, —用sold字段的值作进行时间区间判断
“interval”: “month”, —间隔单位是月
“format”: “yyyy-MM-dd” —返回的数据中,时间字段格式
},
“aggs”: { —表示对桶内数据做metrics
“max_price”: { —指定metrics处理结果的字段名
“max”:{ —metrics类型为max
“field”: “price” —指定取price字段的值做最大值比较
}
},
“min_price”: { —指定metrics处理结果的字段名
“min”:{ —metrics类型为min
“field”: “price” —指定取price字段的值做最小值比较
}
}
}
}
}
}
- es返回数据如下,篇幅所限因此略去了头部和尾部的一些信息,只看关键的:
“aggregations” : { —聚合结果
“sales” : { —请求参数中指定的名称
“buckets” : [ —sales桶的数据在此数组中
{
“key_as_string” : “2014-01-01”, —请求的format参数指定了key的格式
“key” : 1388534400000, —真正的时间字段
“doc_count” : 1, —2014年1月份的文档数量
“max_price” : { —2014年1月的文档做了metrics类型为max的处理后,结果在此
“value” : 80000.0 —2014年1月的文档中,price字段的最大值
},
“min_price” : { —2014年1月的文档做了metrics类型为min的处理后,结果在此
“value” : 80000.0 —2014年1月的文档中,price字段的最大值
}
},
{
“key_as_string” : “2014-02-01”,
“key” : 1391212800000,
“doc_count” : 1,
“max_price” : {
“value” : 25000.0
},
“min_price” : {
“value” : 25000.0
}
},
…
- 上面的请求是以一个月作为区间的,如果想以其他时间单位作为区间又该怎么做呢?例如90天,把interval字段写成90d即可,其他粒度的时间间隔写法如下表:
| 表达式 | 含义 |
| — | — |
| 1y | 一年(数量只能是1,例如2y不合法) |
| 1q | 一个季度(数量只能是1,例如2q不合法) |
| 1M | 一个月(数量只能是1,例如2M不合法,注意区分大写,M表示月,m表示分钟) |
| 1w | 一周(数量只能是1,例如2w不合法) |
| 2d | 两天(数量可以是整数类型) |
| 3h | 三个小时(数量可以是整数类型) |
| 4m | 四分钟(数量可以是整数类型,注意区分大写,M表示月,m表示分钟) |
| 5s | 五秒钟(数量可以是整数类型) |
注意:年、季度、月、周都的数量只能是1,其他粒度的数量可以是整数;
例如以90天作为区间来聚合,请求参数如下:
GET /cars/transactions/_search
{
“size”: 0,
“aggs”: {
“sales”: {
“date_histogram”: {
“field”: “sold”,
“interval”: “90d”, -------表示以90天作为间隔
“format”: “yyyy-MM-dd”
},
“aggs”: {
“max_price”: {
“max”:{
“field”: “price”
}
},
“min_price”: {
“min”:{
“field”: “price”
}
}
}
}
}
}
date_histogram的空桶处理
date_histogram也支持min_doc_count参数,和histogram桶的用法一样,对于下面的请求,es的响应中不会有空桶:
GET /cars/transactions/_search
{
“size”: 0,
“aggs”: {
“sales”: {
“date_histogram”: {
“field”: “sold”,
“interval”: “1M”,
“format”: “yyyy-MM-dd”,
“min_doc_count”: 1
}
}
}
}
扩展实战
-
本篇的最后,来做一个略为复杂的聚合操作:按季度展示每个汽车品牌的销售总额;
-
显然,操作的第一步是按照时间区间做聚合,然后在每个桶中,将文档按照品牌做第二次聚合,第二次聚合的结果也可以理解为多个桶,每个桶中的文档,是某个平台在某个季度的销售总额;
-
请求如下:
GET /cars/transactions/_search
{
“size”: 0, —令返回值的hits对象为空
“aggs”: { —聚合命令
“sales”: { —聚合字段名称
“date_histogram”: { —桶类型为时间区间
“field”: “sold”, —指定sold字段的值作为判断条件
“interval”: “1q”, —区间间隔为1季度
“format”: “yyyy-MM-dd”, —返回的桶的key,被格式化时的格式
“min_doc_count”: 1 —空桶不返回
},
“aggs”: { —第二层桶
“per_make_sum”: { —聚合字段名称
“terms”: { —桶类型为terms
“field”: “make” —按照make字段聚合
},
“aggs”: { —第二层桶的metrics
“sum_price”: { —聚合字段名称
“sum”: { —metrics处理,累加
“field”: “price” —取price字段的值累加
}
}
}
}
}
}
}
}
- 收到响应如下:
“aggregations” : {
“sales” : {
“buckets” : [ —聚合结果
{
“key_as_string” : “2014-01-01”, —当前桶的key的格式化后的值
“key” : 1388534400000, —当前桶的key原值
“doc_count” : 2, —当前桶中文档数
“per_make_sum” : { —第二层桶的名称
“doc_count_error_upper_bound” : 0,
“sum_other_doc_count” : 0,
“buckets” : [ —第二层聚合结果
{
“key” : “bmw”, —聚合字段的值,这里是汽车品牌
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
架构学习资料
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
6MGS-1710398197624)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-08V5O65R-1710398197625)]
架构学习资料
[外链图片转存中…(img-OMh6eChB-1710398197625)]
[外链图片转存中…(img-thZHMpY1-1710398197626)]
[外链图片转存中…(img-OewB69DJ-1710398197626)]
[外链图片转存中…(img-RSAOhaJ3-1710398197627)]
[外链图片转存中…(img-Y7d9MzQC-1710398197627)]
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!