大数据利器Elasticsearch之聚合搜索

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战markdown

平均聚合

平均聚合亦即大白话求平均数。用于计算从聚合文档中提取的数值的平均值。这些值能够从文档中的特定数字字段中提取,也能够由提供的脚本生成。好比,咱们想求银行全部员工的平均工资,有下面几种方式:less

根据字段

请求体:post

POST /bank/_search?size=0
{
    "aggs" : {
        "avg_salary" : { "avg" : { "field" : "salary" } }
    }
}
复制代码

上述聚合计算全部文档的平均工资。聚合类型是avg平均数,而且field设置定义了将计算平均值的文档的数字字段为salary。 返回结果:spa

{
    ...
    "aggregations": {
        "avg_salary": {
            "value": 30065.89
        }
    }
}
复制代码

聚合的名称(avg_salary)用做从返回的响应中检索聚合结果的键。code

经过脚本的方式

根据脚本计算平均工资
请求体:orm

POST /bank/_search?size=0
{
    "aggs" : {
        "avg_salary" : {
            "avg" : {
                "script" : {
                    "source" : "doc.salary.value"
                }
            }
        }
    }
}
复制代码

这会将script参数解释为inline带有painless脚本语言(Elasticsearch默认脚本语言)且没有脚本参数的脚本。
返回结果:ip

{
    ...
    "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.068get

{
    ...
    "aggregations": {
        "avg_salary": {
            "value": 36079.068
        }
    }
}
复制代码

字段存在缺失值如何处理

在处理或统计数据中,常常会遇到缺失值的问题。在Elasticsearch中,missing参数定义应如何处理缺乏值的文档。默认状况下,它们将被忽略,但也可使用missing将它们视为具备值。能够这样处理缺失值(缺失工资数据的就给它分配当地最低工资标准吧:2200):it

POST /exams/_search?size=0
{
    "aggs" : {
        "avg_salary" : {
            "avg" : {
                "field" : "salary",
                "missing": 2200
            }
        }
    }
}
复制代码