Skip to main content

加权平均值 weighted_avg

Weighted Avg Aggregation

单值度量聚合,用于计算从聚合文档中提取的数值的加权平均值。这些值可以从文档中的数字字段中提取。

当计算常规平均值时,每个数据点都有一个相等的“权重”……它对最终值的贡献相等。另一方面,加权平均值对每个数据点的权重不同。每个数据点对最终值的贡献量从文档中提取,或由脚本提供。

作为公式,加权平均值为 ∑(value * weight) / ∑(weight)

规则平均值可以被认为是加权平均值,其中每个值的隐式权重为1。

示例

如果我们的文档有一个包含0-100数字分数的“grade”字段和一个包含任意数字权重的“weight”字段,我们可以使用以下公式计算加权平均值:

POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
},
"weight": {
"field": "weight"
}
}
}
}
}

返回的结果

{
...
"aggregations": {
"weighted_grade": {
"value": 70.0
}
}
}

虽然每个字段允许多个值,但只允许一个权重。如果聚合遇到具有多个权重的文档(例如,权重字段是多值字段),它将抛出异常。如果出现这种情况,则需要为权重字段指定一个脚本,并使用该脚本将多个值组合成一个要使用的值。

此单个权重将独立应用于从值字段中提取的每个值。

此示例显示了如何使用单个权重对具有多个值的单个文档进行平均值计算

POST /exams/_doc?refresh
{
"grade": [1, 2, 3],
"weight": 2
}

POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
},
"weight": {
"field": "weight"
}
}
}
}
}

三个值(1、2和3)将作为独立值包括在内,所有值的权重均为2:

{
...
"aggregations": {
"weighted_grade": {
"value": 2.0
}
}
}

聚合返回2.0作为结果,这与我们手动计算时的预期一致: (1*2)+(2*2)+(3*2))/(2+2+2)==2

Script

值和权重都可以从脚本而不是字段中导出。作为一个简单的示例,下面将使用脚本为文档中的grade和weight 加1:

POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"script": "doc.grade.value + 1"
},
"weight": {
"script": "doc.weight.value + 1"
}
}
}
}
}

Missing values

缺少的参数定义了应如何处理缺少值的文档。值和权重的默认行为不同:

默认情况下,如果缺少值字段,则忽略该文档,聚合将转到下一个文档。如果缺少权重字段,则假设其权重为1(与正常平均值一样)。

这两个默认值都可以用缺少的参数重写:

POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade",
"missing": 2
},
"weight": {
"field": "weight",
"missing": 3
}
}
}
}
}

参数说明

weighted_avg

参数说明缺省
value提供值的字段或脚本的配置必填
weight提供权重的字段或脚本的配置必填
format数字响应格式化可选
value_type关于纯脚本或未映射字段的值的提示可选

value

参数说明缺省
field应从中提取值的字段必填
missing字段完全缺失时使用的值可选

weight

参数说明缺省
field应从中提取权重的字段必填
missing字段完全缺失时使用的权重可选