加权平均值 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 | 字段完全缺失时使用的权重 | 可选 |