Metrics Aggregations(度量聚合)
度量聚合从需要聚合的文档中取一个值(value)来计算文档的相应度量(比如该值在这些文档中的max、sum等)。用于计算的值(value)可以是文档的字段(field),也可以是脚本(script)生成的值。
根据度量聚合输出的度量的个数,可以将度量聚合分类为几种。输出结果只有一个度量结果的,如:max,叫做 single-value numeric metrics
;输出结果有多个度量值的,如:stats,叫做 multi-value numeric metrics
。另外有些度量结果可能不是单个或多个度量值,官方并未对其归类,目前把它们放在其他分类中
根据度量聚合输出的结果可以对度量聚合分为以下几类:
单值 single-value
- Min Aggregation (最小值)
- Max Aggregation (最大值)
- Sum Aggregation(求和)
- Avg Aggregation (平均值)
- Weighted Avg Aggregation (加权平均数)
- Cardinality Aggregation (求计数)
- Value Count Aggregation (统计值的个数)
- Median Absolute Deviation Aggregation (绝对中位差)
多值 multi-value
- Stats Aggregation (统计)
- Extended Stats Aggregation (扩展统计)
- Percentiles Aggregation (百分数)
- Percentiles Ranks Aggregation(百分数排名)
其他度量聚合
- Top hits Aggregation (热们命中)
- Geo Bounds Aggregation (地理边界)
- Geo Centroid Aggregation (地质质心)
- Script Metric Aggregation (脚本度量)
下面对这些一下常用的聚合类型进行详细的讲解
Min Aggregation 、Max Aggregation、Sum Aggregation、Avg Aggregation
这四种聚合分别是求最小值,最大值、求和、平均值
参数配置说明:
参数名称 | 描述 | 需要 |
---|---|---|
field | 指定求值的字段 | 需要 |
missing | 缺省默认值 | 可选 |
script | 通过脚本方式指定所求数据,脚本既可以是存储的脚本也可以是脚本代码 | 可选 |
查询dsl 例子如下(以max为例,其他的的都是一个套路)
POST /sales/_search?size=0
{
"aggs" : {
"max_price" : { ##这里是聚合出来最大值的变量名
"max" : { ##这里是聚合指定的字段,里面是具体的参数配置
"field" : "price" ,
"missing": 10
}
}
}
}
Stats Aggregation、Extended Stats Aggregation
统计聚合是对某一个字段的统计结果,与之前single-value
不同的是,统计聚合返回了多个度量值,包括 min
,max
,sum
,count
,avg
,扩展统计另外还携带 sum_of_squares
(平方和),variance
(方差),std_deviation
(标准差) ,std_deviation_bounds
(标准差界限) ,对于需要求同一个字段的多个度量值的情况,这类聚合就非常有用。
下面看一下两个的参数
参数名称 | 描述 | 所属聚合类型 |
---|---|---|
field | 指定求值的字段 | stats,extended_stats |
script | 通过脚本的方式 | stats,extended_stats |
missing | 缺省默认值 | stats,extended_stats |
sigma | 标准差界限 | extended_stats |
查询dsl,例子如下
GET /exams/_search
{
"size": 0,
"aggs" : {
"grades_stats" : { "extended_stats" : { "field" : "grade" } }
}
}
#返回结果
{
...
"aggregations": {
"grades_stats": {
"count": 2,
"min": 50.0,
"max": 100.0,
"avg": 75.0,
"sum": 150.0,
"sum_of_squares": 12500.0,
"variance": 625.0,
"std_deviation": 25.0,
"std_deviation_bounds": {
"upper": 125.0,
"lower": 25.0
}
}
}
}
默认情况下,extended_stats度量标准将返回一个名为的对象std_deviation_bounds,该对象提供与均值相差两个标准差的区间。但它们并不总是适用于所有数据集。数据必须正常分发才能使指标有意义。标准偏差背后的统计数据假设是正态分布的数据,因此如果数据严重偏向左或右,则返回的值将会产生误导。
sigma可以是任何非负的双精度,意味着您可以请求非整数值,例如1.5。值为0有效,但只返回两者upper和lower边界的平均值。
Weighted Avg Aggregation
这个是求 加权平均是的聚合
weighted_avg 参数配置说明
参数名称 | 描述 | 需要 |
---|---|---|
value | 提供值的字段或脚本的配置(见下表说明) | 需要 |
weight | 提供权重的字段或脚本的配置(见下表说明) | 需要 |
format | 格式化配置 | 可选 |
value_type | 纯脚本或未映射字段配置 | 可选 |
value 参数配置说明
参数名称 | 描述 | 需要 |
---|---|---|
field | 指定求值的字段 | 需要 |
missing | 缺省默认值 | 可选 |
script | 通过脚本的方式 | 可选 |
weight 参数配置说明
参数名称 | 描述 | 需要 |
---|---|---|
field | 指定求值的字段 | 需要 |
missing | 缺省默认值 | 可选 |
script | 通过脚本的方式 | 可选 |
查询dsl 例子如下
POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
},
"weight": {
"field": "weight"
}
}
}
}
}
Cardinality Aggregation
这个是基数聚合,类似于sql 中的 select count(distinct field) from document
cardinality 参数配置说明
参数名称 | 描述 | 需要 | 默认值和范围 |
---|---|---|---|
field | 指定求值的字段 | 需要 | |
missing | 缺省默认值 | 可选 | |
script | 通过脚本的方式 | 可选 | |
precision_threshold | 精度控制 | 可选 | 1-40000,默认3000 |
查询dsl,例子如下
POST /sales/_search?size=0
{
"aggs" : {
"type_count" : {
"cardinality" : {
"field" : "type",
"precision_threshold": 100
}
}
}
}
这里需要注意的是这个值是近似值
计数是近似 计算精确计数需要将值加载到哈希集并返回其大小。当处理高基数集和/或大值作为所需的内存使用时,这不会扩展,并且在节点之间传递那些每个分片集的需要将利用集群的太多资源。
此cardinality聚合基于 HyperLogLog ++ 算法,该算法基于值的哈希值计算,并具有一些有趣的属性:
可配置的精度,决定如何交换内存的准确性, 低基数集的精确度, 固定内存使用情况:无论是数十亿还是数十亿的唯一值,内存使用量仅取决于配置的精度。 对于精度阈值c,我们使用的实现需要大约c * 8字节。 HyperLogLog ++算法取决于散列值的前导零,数据集中散列的精确分布会影响基数的准确性。 另请注意,即使阈值低至100,即使计算数百万个项目,错误仍然非常低。
Value Count Aggregation
这个是统计值的个数 类似于 select count(field) from document
value_count参数配置说明
参数名称 | 描述 | 需要 |
---|---|---|
field | 指定求值的字段 | 需要 |
script | 通过脚本的方式 | 可选 |
查询dsl,例子如下
POST /sales/_search?size=0
{
"aggs" : {
"types_count" : { "value_count" : { "field" : "type" } }
}
}
Median Absolute Deviation Aggregation
这个是用来计算绝对中位差,先了解一下什么是 绝对中位差,以下简称MAD
在统计学中,绝对中位数MAD是对单变量数值型数据的样本偏差的一种鲁棒性测量。同时也可以表示由样本的MAD估计得出的总体参数。
对于单变量数据集X1,X2,...,Xn ,MAD定义为数据点到中位数的绝对偏差的中位数:
MAD=median(∣Xi−median(X)∣)
也就是说,先计算出数据与它们的中位数之间的残差(偏差),MAD就是这些偏差的绝对值的中位数。
示例
考虑数据集(1, 1, 2, 2, 4, 6, 9),它的中位数为2。数据点到2的绝对偏差为(1, 1, 0, 0, 2, 4, 7),该偏差列表的中位数为1(因为排序后的绝对偏差为(0, 0, 1, 1, 2, 4, 7))。所以该数据的绝对中位差为1。
用途
绝对中位差是一种统计离差的测量。而且,MAD是一种鲁棒统计量,比标准差更能适应数据集中的异常值。对于标准差,使用的是数据到均值的距离平方,所以大的偏差权重更大,异常值对结果也会产生重要影响。对于MAD,少量的异常值不会影响最终的结果。
由于MAD是一个比样本方差或者标准差更鲁棒性的度量,它对于不存在均值或者方差的分布效果更好,比如柯西分布。 以上摘抄于 《绝对中位差Median Absolute Deviation》
median_absolute_deviation 参数配置说明
参数名称 | 描述 | 需要 | 默认值和范围 |
---|---|---|---|
field | 指定求值的字段 | 需要 | |
missing | 缺省默认值 | 可选 | |
script | 通过脚本的方式 | 可选 | |
compression | 精度控制 | 可选 | 默认1000 |
查询dsl,例子如下
GET reviews/_search
{
"size": 0,
"aggs": {
"review_variability": {
"median_absolute_deviation": {
"field": "rating",
"compression": 100
}
}
}
}
这里需要注意的是这个值是近似值
计算中位数绝对偏差的简单实现将整个样本存储在内存中,因此该聚合计算出近似值。它使用TDigest数据结构 来近似样本中位数和与样本中位数的偏差中位数。
资源使用与TDigest的分位数近似的准确性之间的折衷,以及因此该聚合的中值绝对偏差的近似的精确度,由compression参数控制。较高的compression设置可以以更高的内存使用量为代价提供更准确的近似值。 compression此聚合的默认值为1000。在此压缩级别,此聚合通常在精确结果的5%范围内,但观察到的性能将取决于样本数据。
Percentiles Aggregation
首先要理解百分位数的概念,简单说,就是将n个数值,从小到大排列。x(i) 表示这些数从小到大数第i个数,那么 x(i) 就是 p百分位数(p = i ÷ n)。或者说百分位数形容的是某个数值处于小到大数列的多少百分位。显而易见中位数就是第50百分位数。
而百分位数聚合则是求多少百分位的数值
percentiles 参数配置说明
参数名称 | 描述 | 需要 | 默认值 |
---|---|---|---|
field | 提供值的字段 | 需要 | |
percents | 指定所求的百分位 | 可选 | [ 1, 5, 25, 50, 75, 95, 99 ] |
keyed | 返回结果显示风格配置 | 可选 | true |
script | 通过脚本的方式 | 可选 | |
compression | 精度控制 | 可选 | 默认100 |
hdr | 默认是使用T-Digests方式,配置该项将使用高动态范围直方图 | 可选 | 具体配置参考官网 |
GET latency/_search
{
"size": 0,
"aggs": {
"load_time_outlier": {
"percentiles": {
"field": "load_time"
}
}
}
}
{
...
"aggregations": {
"load_time_outlier": {
"values" : {
"1.0": 5.0,
"5.0": 25.0,
"25.0": 165.0,
"50.0": 445.0,
"75.0": 725.0,
"95.0": 945.0,
"99.0": 985.0
}
}
}
}
这里需要注意的是这个值是近似值 默认采用T-Digests方式,可以参考上一条的链接
Percentiles Ranks Aggregation
现在我们已经知道了Percentiles Aggregation
是通过百分位求对应的值,而 Percentiles Ranks Aggregation
则是反过来,通过某个值来求他的百分位 同样的,和Percentiles Aggregation
的用法几乎一致
percentile_ranks 参数配置说明
参数名称 | 描述 | 需要 | 默认值 |
---|---|---|---|
field | 提供值的字段 | 需要 | |
values | 指定所求的数值 | 需要 | |
keyed | 返回结果显示风格配置 | 可选 | true |
script | 通过脚本的方式 | 可选 | |
compression | 精度控制 | 可选 | 默认100 |
hdr | 默认是使用T-Digests方式,配置该项将使用高动态范围直方图 | 可选 | 具体配置参考官网 |
GET latency/_search
{
"size": 0,
"aggs": {
"load_time_ranks": {
"percentile_ranks": {
"field": "load_time",
"values": [500, 600],
"keyed": false #上面举了keyed默认true例子,这里示范keyed为false的例子
}
}
}
}
{
...
"aggregations": {
"load_time_ranks": {
"values": [
{
"key": 500.0,
"value": 55.00000000000001
},
{
"key": 600.0,
"value": 64.0
}
]
}
}
}
这里需要注意的是这个值是近似值 这个同样参考Percentiles Aggregation
Top hits Aggregation 以及与 Field Collapsing区别
>>未完待续
其他
度量聚合除了上面的集中之外还有三种分别是Geo Bounds Aggregation
(地理边界),Geo Centroid Aggregation
(地质质心),Script Metric Aggregation
(脚本度量)。这几种具体用法可以参考官方文档,这里不做讲解。
声明:本文和后续文章中未声明部分引用来自于官方文档,其余部分引用均已添加引用来源。文章为博主整理,转载需注明来源https://my.oschina.net/MyoldTime/blog/3095829