Weighted Avg Aggregation
单值度量标准聚合,用于计算从聚合文档中提取的数值的加权平均值。可以从文档中的特定数字字段提取这些值。
在计算常规平均值时,每个数据点具有相等的“权重”……它对最终值的贡献相等。另一方面,加权平均值对每个数据点的权重不同。每个数据点对最终值的贡献量是从文档中提取的,或由脚本提供的。
作为公式,加权平均值是Σ(值*权重)/Σ(权重)
常规平均值可以被认为是加权平均值,其中每个值的隐含权重为1。
Table 4. weighted_avg Parameters
Parameter | Default | |
---|---|---|
Name | Description | Required |
value | 提供值的字段或脚本的配置 | Required |
weight | 提供权重的字段或脚本的配置 | Required |
format | 数字响应格式化程序 | Optional |
value_type | 关于纯脚本或未映射字段的值的提示 | Optional |
值和权重对象具有每个字段的特定配置:
Table 5. value Parameters
Paranameter Name | Description | Required | Defult Value |
---|---|---|---|
field | 应从中提取值的字段 | Required | |
missing | 如果字段完全丢失则使用的值 | Optional |
Table 6. weight Parameters
Paranameter Name | Description | Required | Defult Value |
---|---|---|---|
field | 应从中提权重的字段 | Required | |
missing | 如果场地完全缺失则使用的权重 | Optional |
Examples 如果我们的文档的“等级”字段包含0-100数字分数,而“权重”字段包含任意数字权重,我们可以使用以下公式计算加权平均值:
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
值和权重都可以从脚本而不是字段派生。举个简单的例子,下面将使用脚本在文档中添加一个等级和权重:
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
}
}
}
}
}