对ES官网的reference的翻译,同时也是备忘,ES版本为7.5
下面是正文翻译,附上原文链接
==================================================================================================
加权平均聚合
一种单值指标聚合,计算从聚合的文档中提取出来的数值的加权平均。这些数值可以从文档中某些特定的数值字段中提取出来,也可以使用给定的脚本生成。
当计算常规的平均值时,每个数据点的权重是一样的...每个数据点对最终值的贡献是一样的。另一方面,加权平均给每个数据点附上来不同权重。每个数据点对最终值的贡献度是从文档中提取的,或者脚本提供的。
加权平均的公式是:
常规的平均值可以认为是每个值的权重都为1的加权平均。
参数名 | 描述 | 是否必须 |
---|---|---|
value | 字段配置或者提供值的脚本 | 必须 |
weight | 字段配置或者提供值的脚本 | 必须 |
format | 数值响应的格式器 | 可选 |
value_type | 纯脚本或者未被映射的字段的值的提示 | 可选 |
value和weight参数又有特定的配置:
参数名 | 描述 | 是否必须 |
---|---|---|
field | 值应该从哪个字段提取 | 必须 |
missing | 如果被提取值的字段为空,就使用这个值 | 可选 |
参数名 | 描述 | 是否必须 |
---|---|---|
field | 权重应该从哪个字段提取 | 必须 |
missing | 如果权重字段为空,就使用这个值 | 可选 |
例子
假设我们的文档有个grade字段记录0-100的得分情况,以及有个weight字段记录的是随机的权重,我们可以这样计算加权平均:
curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type:application/json'
-d '{
"size": 0,
"aggs": {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
}
"weight": {
"field": "weight"
}
}
}
}
}'
上面的请求会返回下面的响应:
{
...
"aggregations": {
"weighted_grade": {
"value": 70.0
}
}
}
尽管我们允许某些字段可能会有多个值,但weight字段是唯一的。如果聚合遇到了一个拥有超过1个weight字段的文档(比如,weight字段有多个值),聚合会跑出异常。如果你会遇到这种场景,你需要为weight字段指定一个脚本并使用这个脚本将多个值组合成一个值。
单个weight字段会独立的作用于从value字段中提取出来的值上面。
下面的例子展示了某个字段拥有多个值的文档是如何使用单个weight字段取平均值的:
# 插入一个文档
curl -X POST http://host_ip:host_port/exams/_doc?pretty
-H 'content-type:application/json'
-d '{
"grade":[1,2,3],
"weight":2
}'
# 利用聚合求加权平均值
curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type:application/json'
-d '{
"aggs": {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
}
"weight": {
"field": "weight"
}
}
}
}
}'
grade字段的三个值(1,2,3)会作为三个独立的权重为2的值计算:
{
...
"aggregations": {
"weighted_grade": {
"value": 2.0
}
}
}
上面的聚合会返回2.0,这与我们的预期相符合:((1*2)+(2*2)+(3*2))/(2+2+2)=2.0
脚本
value和weight字段的值都可以从脚本中得到,不一定要从field字段中拿到。下面是个简单的例子:使用脚本对文档中的grade和weight值加1:
curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type: application/json'
-d '{
"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作为weight字段的值。
上面的默认行为可以使用missing参数重写:
curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type: application/json'
-d '{
"size": 0,
"aggs": {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade",
"missing": 2
},
"weight": {
"field": "weight",
"missing": 3
}
}
}
}
}'
来源:CSDN
作者:_silverBlack
链接:https://blog.csdn.net/li1914309758/article/details/103773237