Elasticsearch 聚合学习之二:区间聚合
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本文是《Elasticsearch 聚合学习》系列的第二篇,上一篇是我们熟悉了聚合的基本操作,本篇的内容是按照区间聚合的实战操作;
系列文章列表
环境信息
以下是本次实战的环境信息,请确保您的 Elasticsearch 可以正常运行:
操作系统:Ubuntu 18.04.2 LTS
JDK:1.8.0_191
Elasticsearch:6.7.1
Kibana:6.7.1
实战用的数据依然是一些汽车销售的记录,在第一章有详细的导入步骤,请参考操作,导入后您的 es 中的数据如下图:
本章概要
本篇实战的聚合操作有以下内容:
指定字段的区间聚合;
时间字段的区间聚合;
扩展实战;
接下来开始实战吧。
条形图(histogram 桶)
还记得 terms 桶么,用来将指定字段值相同的文档聚合在一个桶中,而 histogram 桶是将指定字段值在某个范围内的文档聚合在一个桶中,如下图所示,0-19999 是一个桶,11000 和 15000 在一个桶内,23000 和 31000 在一个桶内,这就是 histogram 桶:
以汽车销售记录为例做一次聚合查询,为售价创建 histogram 桶,以 20000 作为间隔,每个桶负责的区间如上图所示,相关的销售记录就会被放入对应的桶中,请求参数和说明如下:
es 返回的数据和说明如下:
控制空桶是否返回
在上面的返回值中,第三个桶中没有文档,在有的业务场景中,我们不需要没有数据的桶,此时可以用 min_doc_count 参数来控制,如果 min_doc_count 等于 2,表示桶中最少有两条记录才会出现在返回内容中,如下所示,min_doc_count 如果等于 1,那么空桶就不会被 es 返回了:
返回值如下所示,没有文档的桶不再出现:
histogram 桶加 metrics
上面的例子返回结果只有每个桶内的文档数,也可以加入 metrics 对桶中的数据进行处理,例如计算每个区间内的最高价、最低价、平均售价,可以加入 max、min、avg 参数,如下:
es 返回数据和说明如下,可见每个桶中的文档都做了三种 metrics 处理:
时间区间的桶(date_histogram)
按照时间区间聚合也是常用的功能,例如在 ELK 上查询日志,通常都是按照时间来分段的,如下图:
histogram 桶可以实现按照时间分段么?如果用毫秒数来处理,似乎是可以的,但是对年月日的处理就力不从心了,常见的时间区间处理,用 date_histogram 桶即可满足要求;
下面就是 date_histogram 桶的用法:每月销售多少台汽车:
es 返回数据如下,篇幅所限因此略去了头部和尾部的一些信息,只看关键的:
上面的请求是以一个月作为区间的,如果想以其他时间单位作为区间又该怎么做呢?例如 90 天,把 interval 字段写成 90d 即可,其他粒度的时间间隔写法如下表:
注意:年、季度、月、周都的数量只能是 1,其他粒度的数量可以是整数;
例如以 90 天作为区间来聚合,请求参数如下:
date_histogram 的空桶处理
date_histogram 也支持 min_doc_count 参数,和 histogram 桶的用法一样,对于下面的请求,es 的响应中不会有空桶:
扩展实战
本篇的最后,来做一个略为复杂的聚合操作:按季度展示每个汽车品牌的销售总额;
显然,操作的第一步是按照时间区间做聚合,然后在每个桶中,将文档按照品牌做第二次聚合,第二次聚合的结果也可以理解为多个桶,每个桶中的文档,是某个平台在某个季度的销售总额;
请求如下:
收到响应如下:
至此,区间聚合的学习和实战就完成了,到目前为止,我们的操作用的都是索引中的全部数据,但是真是生产环境中,不会每次都用全部数据来做聚合,因此接下来的章节,会将聚合与查询、过滤等操作结合在一起实战;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/ec62411c254eb6115ed6e6083】。文章转载请联系作者。
评论