加权平均聚合
单值度量聚合,计算从聚合文档中提取的数值的加权平均值。这些值可以从文档中的特定数字字段中提取。
计算常规平均值时,每个数据点都有一个相等的“权重”……,它对最终值的贡献相等。另一方面,加权平均值对每个数据点的权重不同。每个数据点贡献给最终值的量从文档中提取,或由脚本提供。
加权平均数公式:∑(value * weight) / ∑(weight)
一般的平均值可以看作是加权平均值,其中每个值的隐式权重为1。
Table 4. weighted_avg
Parameters(加权平均参数)
Parameter Name | Description | Required | Default Value |
| 提供值的字段或脚本的配置 | Required | |
| 提供权重的字段或脚本的配置 | Required | |
| 数字响应格式化程序 | Optional | |
| 纯脚本或未映射字段的值提示 | Optional | |
值和权重对象具有每个字段特定的配置:
Table 5. value
Parameters (value
参数)
Parameter Name | Description | Required | Default Value |
| 应从中提取值的字段 | Required | |
| 缺省值 | Optional | |
Table 6. weight
Parameters (权重 参数)
Parameter Name | Description | Required | Default Value |
| 应从中提取权重的字段 | Required | |
| 缺省值 | Optional | |
示例
如果我们的文档中的“grade”字段包含0-100个数字分数,而“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
脚本
值和权重都可以从脚本而不是字段派生。作为一个简单的例子,下面将使用脚本向文档中的等级和权重添加一个:
POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"script": "doc.grade.value + 1"
},
"weight": {
"script": "doc.weight.value + 1"
}
}
}
}
}
缺省值
缺少参数定义如何处理缺少值的文档。默认行为对于值和权重是不同的:
默认情况下,如果缺少值字段,则忽略该文档,并将聚合移到下一个文档。如果缺少“权重”字段,则假定其权重为1(类似于正常平均值)。
这两个默认值都可以用缺少的参数覆盖:
POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade",
"missing": 2
},
"weight": {
"field": "weight",
"missing": 3
}
}
}
}
}