欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Elasticsearch 之聚合分析入门

程序员文章站 2022-03-10 19:14:50
本文主要介绍 Elasticsearch 的聚合功能,介绍什么是 Bucket 和 Metric 聚合,以及如何实现嵌套的聚合。 首先来看下聚合(Aggregation): 什么是 Aggregation? 首先举一个生活中的例子,这个是京东的搜索界面,在搜索框中输入“华为”进行搜索,就会得到如上界 ......

本文主要介绍 elasticsearch 的聚合功能,介绍什么是 bucket 和 metric 聚合,以及如何实现嵌套的聚合。

首先来看下聚合(aggregation):

什么是 aggregation?

Elasticsearch 之聚合分析入门

首先举一个生活中的例子,这个是京东的搜索界面,在搜索框中输入“华为”进行搜索,就会得到如上界面,搜索框就是我们常用的搜索功能,而下面这些,比如分类、热点、操作系统、cpu 类型等是根据 es 的聚合分析获得的相关结果。

看完上面这个例子,下面来看下聚合的定义:

es 除了搜索以外,还提供针对 es 数据进行统计分析的功能,也就是聚合,它的特点是实时性非常高,所有的计算结果都是即时返回的,而 hadoop 等大数据系统得到一个统计结果需要一天的时间,一般都是 t + 1 级别的。

通过聚合,我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档,比如海淀区和东城区的客房数量,不同价格区间,可预订的经济型酒店和商务型酒店的数量,这样可以帮助我们过滤搜索的结果,这样的优点是性能高,只需要一条语句,就可以从 es 得到分析结果,无需再客户端自己去实现分析逻辑。

在 es 的聚合中主要一共分为四大类:

  • bucket aggregation:分桶类型,一些列满足特定条件的文档的集合
  • metric aggregation:指标分析类型,一些数学运算,可以对文档字段进行统计分析,比如计算最大值、最小值、平均值等
  • pipeline aggregation:管道分析类型,对其他聚合结果进行二次聚合
  • matrix aggregation:矩阵分析类型,支持对多个字段的操作并提供一个结果矩阵

在以后的文章会对这些做详细的讲解,本文先来了解下什么是 bucket 和 metric:

bucket 简单来说相当于 sql 中的 group,可以根据条件,把结果分成一个一个的组,那 metric 相当于 sql 中的 count,可以去执行一系列的统计方法。

接下来看什么是 bucket aggregation:

bucket aggregation

Elasticsearch 之聚合分析入门

bucket 就是桶的意思,即按照一定的规则将文档分配到不同的桶中,达到分类分析的目的。如上图所示,左边有一堆文档,右边有三个桶,每个桶有不同的规则,比如第一个桶的规则为价格小于 3000 的,第二个桶为价格大于等于 3000 小于 6000 的,最后一个桶的规则为价格大于 6000 的,然后不同的文档根据不同的价格分到不同的桶中,那么我们就实现了分类。

有了 bucket 聚合分析机制,我们就可以把公司员工以年龄方式进行区分,以地理位置的方式来区分客户,以男性女性来区分演员等。

根据 bucket 的分桶策略,常见的 bucket 聚合分析如下:

  • terms:直接按照 term 来分桶,如果是 text 类型,则按照分词后的结果分桶
  • range:指定数值的范围来设定分桶规则
  • date range:指定日期的范围来设定分桶规则
  • histogram:直方图,以固定间隔的策略来分割数据
  • date histogram:针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型

下面以 terms 为例,让我们动手实践下:

Elasticsearch 之聚合分析入门

这是一个查看航班目的地的统计信息的例子,通过指定关键词为 terms,然后指明 term 字段 fielddestcountry,下面我们请求下,查看下请求结果:

Elasticsearch 之聚合分析入门

从结果中可以看到文档根据目的地分成了不同的桶,每个桶还包括 doc_count,这样就可以很轻松知道 es 存储的航班信息中,去往意大利、美国、中国等国家分别有多少架航班。

在简单了解了 bucket 聚合分析后,让我们来看下 metric 聚合分析:

metric aggregation

metric 是基于数据集计算的结果,除了支持在字段上进行计算,同样也支持在脚本产生的结果之上进行计算。metric 主要分为单值分析和多值分析,具体内容如下:

单值分析,只输出一个分析结果:

  • min、max、avg、sum
  • cardinality

其中,min、max、avg、sum 这些很容易理解,在这里说一下 cardinality,它是指不同数值的个数,相当于 sql 中的 distinct。

多值分析,输出多个分析结果:

  • stats、extended stats
  • percentiles、percentile ranks
  • top hits

其中,stats 是做多样的数据分析,可以一次性得到最大值、最小值、平均值、中值等数据;extended stats 是对 stats 的扩展,包含了更多的统计数据,比如方差、标准差等;percentilespercentile ranks 是百分位数的一个统计;top hits 一般用于分桶后获取桶内最匹配的顶部文档列表,即详情数据。

了解之后,让我们实操起来,紧接着刚才查看航班目的地的统计信息的例子,如果还想知道机票的均价,最高最低价格,该怎么做呢?这就需要用到 metric 了:

Elasticsearch 之聚合分析入门

我们在请求中加入 aggs,其中 avg_price 为自己定义的名字,这个是为了方便在以后理解这个字段返回值的含义,然后分别关键词分别选择 avg、max、min 来完成计算目的地不同的航班的机票均价、最高最低价格,这个请求的执行结果如下所示:

Elasticsearch 之聚合分析入门

从结果中可以看出,飞往意大利的航班一共有 2371 架,其中机票最高价格为 1195 元,最低价格为 100 元,平均价格为 586 元,很快就可以得到统计的一些结果。

另外,聚合分析还支持嵌套,那么让我们看下如果实现一个嵌套聚合分析:

Elasticsearch 之聚合分析入门

通过这个请求不但可以获取到航班目的地的统计信息,还可以得到航班抵达时的天气状况,运行结果如下所示:

Elasticsearch 之聚合分析入门

可以看出,在抵达意大利的航班中,抵达时的天气有 424 次为晴天,417 次为下雨天等,所以通过嵌套的方式就可以很快得到更深层次的数据统计值。

总结

本文对 elasticsearch 的聚合功能做了初步介绍,也学习 bucket 和 metric 聚合分析,在后续文章会对聚合功能做一个更加深入的讲解。

下面是我总结的 elasticsearch 聚合分析的思维导图,在公众号【武培轩】回复【es】获取思维导图以及源代码。

Elasticsearch 之聚合分析入门

参考文献

elastic stack从入门到实践

elasticsearch核心技术与实战