大数据利器Elasticsearch之聚合搜索

182 阅读2分钟

这是我参与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
            }
        }
    }
}