5.1.2. 加权平均聚合
加权平均聚合
单值
度量聚合,计算从聚合文档中提取的数值的加权平均值。这些值可以从文档中的特定数字字段中提取。
在计算常规平均值时,每个数据点都具有相等的权重
...它对最终值的贡献均等。另一方面,加权平均对每个数据点的加权不同。每个数据点对最终值的贡献量是从文档中提取的,或由脚本提供的。
作为一个公式,加权平均数是: ∑(value * weight) / ∑(weight)
一个普通的平均值可以被认为是一个加权平均值,只是其中每个值都有一个隐含权值为1。
表 3. 加权平均
参数
参数名 | 描述 | 是否必填 | 默认值 |
---|---|---|---|
value |
提供值的字段或脚本的配置 | 必填 | |
weight |
提供权重的字段或脚本的配置 | 必填 | |
format |
数字响应格式化 | 可选 | |
value_type |
有关纯脚本或未映射字段的值的提示 | 可选 |
值
和权重
对象有每个字段特定的配置:
表 4. value
参数设置
参数名 | 描述 | 是否必填 | 默认值 |
---|---|---|---|
field |
应该从中提取值的字段 | 必填 | |
missing |
如果字段完全丢失可使用一个值 | 选填 |
表 5. weight
参数设置
参数名 | 描述 | 是否必填 | 默认值 |
---|---|---|---|
field |
应该从中提取值的字段 | 必填 | |
missing |
如果字段完全丢失可使用一个值 | 选填 |
例子
如果我们的文档有一个等级
字段,该字段的得分为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
}
}
}
虽然每个字段允许多个值,但仅允许一个权重。如果汇总中遇到的文件的权重超过一个(例如,权重字段是多值字段),它将引发异常。如果遇到这种情况,则需要为权重字段指定脚本
,然后使用脚本将多个值组合为一个要使用的值。
该单个权重将独立应用于从value
字段提取的每个值。
此示例说明如何使用单个权重对具有多个值的单个文档进行平均:
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
虽然每个字段允许多个值,但仅允许一个权重。如果汇总中遇到的文件的权重超过一个(例如,权重字段是多值字段),它将引发异常。如果遇到这种情况,则需要为权重字段指定脚本
,然后使用脚本将多个值组合为一个要使用的值。
该单个权重将独立应用于从value
字段提取的每个值。
此示例说明如何使用单个权重对具有多个值的单个文档进行平均:
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"
}
}
}
}
}
缺失值
missing
参数定义了当文档缺失默认值的时候应如何处理。 value
跟 weight
的默认行为是不同的:
默认情况下,如果缺少value
字段,则会忽略该文档,并且聚合将继续到下一个文档。如果缺少weight
字段,则假定其具有1
的权重(如正常平均值)。
可以使用missing
参数覆盖这两个默认值:
POST /exams/_search
{
"size": 0,
"aggs" : {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade",
"missing": 2
},
"weight": {
"field": "weight",
"missing": 3
}
}
}
}
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。