这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
平均聚合
平均聚合亦即大白话求平均数。用于计算从聚合文档中提取的数值的平均值。这些值可以从文档中的特定数字字段中提取,也可以由提供的脚本生成。比如,我们想求银行所有员工的平均工资,有下面几种方式:
根据字段
请求体:
POST /bank/_search?size=0
{
"aggs" : {
"avg_salary" : { "avg" : { "field" : "salary" } }
}
}
上述聚合计算所有文档的平均工资。聚合类型是avg平均数,并且field设置定义了将计算平均值的文档的数字字段为salary。
返回结果:
{
...
"aggregations": {
"avg_salary": {
"value": 30065.89
}
}
}
聚合的名称(avg_salary)用作从返回的响应中检索聚合结果的键。
通过脚本的方式
根据脚本计算平均工资
请求体:
POST /bank/_search?size=0
{
"aggs" : {
"avg_salary" : {
"avg" : {
"script" : {
"source" : "doc.salary.value"
}
}
}
}
}
这会将script参数解释为inline带有painless脚本语言(Elasticsearch默认脚本语言)且没有脚本参数的脚本。
返回结果:
{
...
"aggregations": {
"avg_salary": {
"value": 30065.89
}
}
}
根据传递修正参数进行修正平均数数据
到年底了,这一年的银行业绩非常好,收益远高于同行的平均水平,领导决定需要统一进行全年涨薪20%。我们就可以使用params进行传递参数进去使用脚本来获得新的平均工资:
POST /bank/_search?size=0
{
"aggs" : {
"avg_corrected_salary" : {
"avg" : {
"field" : "salary",
"script" : {
"lang": "painless",
"source": "_value * params.increase",
"params" : {
"increase" : 1.2
}
}
}
}
}
}
这样就可以获得全体涨薪后平均工资:36079.068
{
...
"aggregations": {
"avg_salary": {
"value": 36079.068
}
}
}
字段存在缺失值如何处理
在处理或统计数据中,经常会遇到缺失值的问题。在Elasticsearch中,missing参数定义应如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以使用missing将它们视为具有值。可以这样处理缺失值(缺失工资数据的就给它分配当地最低工资标准吧:2200):
POST /exams/_search?size=0
{
"aggs" : {
"avg_salary" : {
"avg" : {
"field" : "salary",
"missing": 2200
}
}
}
}