ElasticSearch聚合查询—— Metrics Aggregations

返回 ElasticSearch 聚合查询——开篇

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 不同的是,统计聚合返回了多个度量值,包括 minmaxsumcountavg ,扩展统计另外还携带 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

转载于:https://my.oschina.net/MyoldTime/blog/3095831

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值