天天看点

ES度量聚合(ElasticSearch Metric Aggregations)

从本篇将开始进入ES系列的聚合部分(Aggregations)。

本篇重点介绍Elasticsearch Metric Aggregations(度量聚合)。

Metric聚合,主要针对数值类型的字段,类似于关系型数据库中的sum、avg、max、min等聚合类型。

本例基于如下索引进行试验:

对应的SQL表结构如下:

平均值聚合。

注:max,sum,min等使用与avg类似,故不重复介绍。

对字段grade取平均值。

对应的java示例如下:

其中代码@1:missing(0)表示如果文档中没有取平均值的字段时,则使用该值进行计算,本例中使用0参与计算。

其返回结果如下:

加权平均聚合,其算法,∑(value * weight) / ∑(weight)。

加权平均(weghted_avg)支持的参数列表:

value

提供值的字段或脚本的配置。例如定义计算哪个字段的平均值,该值支持如下子参数:

field

用来定义平均值的字段名称。

missing

用来定义如果匹配到的文档没有avg字段,使用该值来参与计算。

weight

用来定义权重的对象,其可选属性如下:

定义权重来源的字段。

如果文档缺失权重来源字段,以该值来代表该文档的权重值。

format

数值类型格式化。

value_type

用来指定value的类型,例如ValueType.DATE、ValueType.IP等。

示例如下:

从文档中抽取属性为weight的字段的值来当权重值。

其JAVA示例如下:

基数聚合,先distinct,再聚合,类似关系型数据库(count(distinct))。

对应的JAVA示例如下:

返回结果如下:

上述实现与SQL:SELECT COUNT(DISTINCT buyerId) from es_order_tmp where sellerId=24; 效果类似,表示购买了商家id为24的买家个数。

其核心参数如下:

precision_threshold

精确度控制。在此计数之下,期望计数接近准确。在这个值之上,计数可能会变得更加模糊(不准确)。支持的最大值是40000,超过此值的阈值与40000的阈值具有相同的效果。默认值是3000。

上述示例中返回的11是精确值,如果改写成下面的代码,结果将变的不准确:

Pre-computed hashes

一个比较好的实践是需要对字符串类型的字段进行基数聚合的话,可以提前索引该字符串的hash值,通过对hash值的聚合,提高效率。

Missing Value

missing参数定义了应该如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有一个值,通过missing value来设置。

中位绝对偏差聚合。由于这部分内容与统计学关系密切,但这并不是我的特长,故对该统计的含义做深入解读,在实际场景中,我们只需要知道ES提供了中位数偏差统计的功能,如果有这方面的需求,我们知道如何使用ES的中位数统计即可。

官方场景:

假设我们收集了商品评价数据(1星到5星之间的数值)。在实际使用过程中通常会使用平均值来展示商品的整体评价等级。中位绝对偏差聚合可以帮助我们了解评审之间的差异有多大。

在这个例子中,我们有一个平均评级为3星的产品。让我们看看它的评级的绝对偏差中值,以确定它们的变化有多大。按照我的理解,中位绝对偏差聚合 ,聚合的数据来源于(原始数据 -  所有原始数值的平均值 的绝对值进行聚合)。

例如评论原始数据如下:

1、2、5、5、4、3、5、5、5、5

其平均值:4

那中位数绝对偏差值聚合的数据为:

3、2、1、1、0、1、1、1、1、1

其Restfull示例如下:

该聚合包含两部分。

代码@1:针对字段rating使用AVG进行聚合(平均聚合,求出中位数)

代码@2:针对字段rating进行中位数绝对偏差聚合。

备注:在es high rest api中未封装(median absolute deviation aggregation)聚合。

ES 关于 Metric聚合就介绍到这里了,接下来将重点分析Es Buket聚合。

https://mp.weixin.qq.com/s/zYPM2XRt1jYVsrtahMjTlg