ES官网reference翻译文章(12)—Weighted Avg Aggregation

对ES官网的reference的翻译,同时也是备忘,ES版本为7.5

下面是正文翻译,附上原文链接

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-weight-avg-aggregation.html

==================================================================================================

加权平均聚合

一种单值指标聚合,计算从聚合的文档中提取出来的数值的加权平均。这些数值可以从文档中某些特定的数值字段中提取出来,也可以使用给定的脚本生成。

当计算常规的平均值时,每个数据点的权重是一样的...每个数据点对最终值的贡献是一样的。另一方面,加权平均给每个数据点附上来不同权重。每个数据点对最终值的贡献度是从文档中提取的,或者脚本提供的。

加权平均的公式是:\sum (value*weight) / \sum (weight)

常规的平均值可以认为是每个值的权重都为1的加权平均。

weighted_avg参数
参数名描述是否必须
value字段配置或者提供值的脚本必须
weight字段配置或者提供值的脚本必须
format数值响应的格式器可选
value_type纯脚本或者未被映射的字段的值的提示可选

value和weight参数又有特定的配置:

value参数
参数名描述是否必须
field值应该从哪个字段提取必须
missing如果被提取值的字段为空,就使用这个值可选

 

 

 

 

weight参数
参数名描述是否必须
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
                }
            }
        }
    }
}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值