Skip to main content

扩展统计聚合 extended_stats

Extended Stats Aggregation

多值度量聚合,用于计算从聚合文档中提取的数值的统计信息。这些值可以从文档中的特定数字字段中提取,也可以由提供的脚本生成。

extended_stats聚合是stats聚合的扩展版本,其中添加了其他度量,如sum_of_squares、variance、std_deviation和std_deviation_bounds。

假设数据由代表学生考试成绩(0至100)的文件组成

GET /exams/_search
{
"size": 0,
"aggs" : {
"grades_stats" : { "extended_stats" : { "field" : "grade" } }
}
}

上述汇总计算所有文档的成绩统计。聚合类型为extended_stats,字段设置定义了要计算统计信息的文档的数字字段。上面将返回以下内容:

{
...

"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
}
}
}
}

聚合的名称(上面的grades_stats)也用作键,通过该键可以从返回的响应中检索聚合结果。

标准偏差界限

默认情况下,extended_stats度量将返回一个名为std_deviation_bounds的对象,该对象提供与平均值正负两个标准偏差的间隔。这是可视化数据差异的有用方法。如果您需要不同的边界,例如三个标准偏差,可以在请求中设置sigma:

GET /exams/_search
{
"size": 0,
"aggs" : {
"grades_stats" : {
"extended_stats" : {
"field" : "grade",
"sigma" : 3
}
}
}
}

sigma控制应显示多少与平均值+/-的标准偏差

sigma可以是任何非负双精度,这意味着您可以请求非整数值,例如1.5。值0是有效的,但只会返回上限和下限的平均值。

info

标准偏差和界限要求正态性
默认情况下显示标准偏差及其边界,但它们并不总是适用于所有数据集。您的数据必须是正常分布的,才能使度量有意义。标准偏差背后的统计数据假设数据为正态分布,因此如果数据严重向左或向右倾斜,则返回的值将具有误导性

Script

根据脚本计算成绩统计:

GET /exams/_search
{
"size": 0,
"aggs" : {
"grades_stats" : {
"extended_stats" : {
"script" : {
"source" : "doc['grade'].value",
"lang" : "painless"
}
}
}
}
}

这将把脚本参数解释为具有painless脚本且没有脚本参数的inline script。要使用存储的脚本,请使用以下语法:

GET /exams/_search
{
"size": 0,
"aggs" : {
"grades_stats" : {
"extended_stats" : {
"script" : {
"id": "my_script",
"params": {
"field": "grade"
}
}
}
}
}
}

Value Script

结果发现,这场考试远远超出了学生的水平,需要进行成绩修正。我们可以使用value脚本获取新的统计数据:

GET /exams/_search
{
"size": 0,
"aggs" : {
"grades_stats" : {
"extended_stats" : {
"field" : "grade",
"script" : {
"lang" : "painless",
"source": "_value * params.correction",
"params" : {
"correction" : 1.2
}
}
}
}
}
}

Missing Value

缺少的参数定义了应如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。

GET /exams/_search
{
"size": 0,
"aggs" : {
"grades_stats" : {
"extended_stats" : {
"field" : "grade",
"missing": 0
}
}
}
}

grade字段中没有值的文档将与值为0的文档属于同一个存储桶。