Elasticsearch除搜索以外,提供了针对ES 数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:
- 什么品牌的手机最受欢迎?
- 这些手机的平均价格、最高价格、最低价格?
- 这些手机每月的销售情况如何?
使用场景
聚合查询可以用于各种场景,比如商业智能、数据挖掘、日志分析等等。
- 电商平台的销售分析:统计每个地区的销售额、每个用户的消费总额、每个产品的销售量等,以便更好地了解销售情况和趋势。
- 社交媒体的用户行为分析:统计每个用户的发布次数、转发次数、评论次数等,以便更好地了解用户行为和趋势,同时可以将数据按照地区、时间、话题等维度进行分析。
- 物流企业的运输分析:统计每个区域的运输量、每个车辆的运输次数、每个司机的行驶里程等,以便更好地了解运输情况和优化运输效率。
- 金融企业的交易分析:统计每个客户的交易总额、每个产品的销售量、每个交易员的业绩等,以便更好地了解交易情况和优化业务流程。
- 智能家居的设备监控分析:统计每个设备的使用次数、每个家庭的能源消耗量、每个时间段的设备使用率等,以便更好地了解用户需求和优化设备效能。
基本语法
聚合查询的语法结构与其他查询相似,通常包含以下部分:
- 查询条件:指定需要聚合的文档,可以使用标准的 Elasticsearch 查询语法,如 term、match、range 等等。
- 聚合函数:指定要执行的聚合操作,如 sum、avg、min、max、terms、date_histogram 等等。每个聚合命令都会生成一个聚合结果。
- 聚合嵌套:聚合命令可以嵌套,以便更细粒度地分析数据。
aggs_name:聚合函数的名称
agg_type:聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)
field_name:字段名称或者叫域名。
聚合的分类
Metric Aggregation:—些数学运算,可以对文档字段进行统计分析,类比Mysql中的 min(), max(), sum() 操作。
Bucket Aggregation: 一些满足特定条件的文档的集合放置到一个桶里,每一个桶关联一个key,类比Mysql中的group by操作。
Pipeline Aggregation:对其他的聚合结果进行二次聚合
DELETE /meituan_employee
PUT /meituan_employee
{
"mappings": {
"properties": {
"age":{
"type": "integer"
},
"gender":{
"type": "keyword"
},
"job":{
"type": "text",
"fields": {
"keyword":{
"type":"keyword",
"ignore_above":50
}
}
},
"name":{
"type":"keyword"
},
"salary":{
"type": "integer"
}
}
}
}
PUT /meituan_employee/_doc/1
{"name":"Emma","age":32,"job":"Product Manager","gender":"female","salary":35000 }
PUT /meituan_employee/_doc/2
{"name": "Underwood","age":41,"job":"Dev Manager","gender":"male","salary":50000}
PUT /meituan_employee/_doc/3
{"name": "Tran","age":25,"job":"Web Designer","gender":"male","salary":18000}
PUT /meituan_employee/_doc/4
{"name": "Rivera","age":26,"job":"Web Designer","gender":"female","salary": 22000}
PUT /meituan_employee/_doc/5
{"name": "Rose","age":25,"job":"QA","gender":"female","salary":18000}
PUT /meituan_employee/_doc/6
{"name": "Lucy","age":31,"job":"QA","gender":"female","salary":25000}
PUT /meituan_employee/_doc/7
{"name": "Byrd","age":27,"job":"QA","gender":"male","salary":20000 }
PUT /meituan_employee/_doc/8
{"name": "Foster","age":27,"job":"Java Programmer","gender":"male","salary": 20000}
PUT /meituan_employee/_doc/9
{"name" : "Gregory","age":32,"job":"Java Programmer","gender":"male","salary": 22000}
PUT /meituan_employee/_doc/10
{ "name": "Bryant","age":20,"job":"Java Programmer","gender":"male","salary": 9000}
PUT /meituan_employee/_doc/11
{ "name": "Jenny","age":36,"job":"Java Programmer","gender":"female","salary": 38000}
PUT /meituan_employee/_doc/12
{ "name": "Mcdonald","age":31,"job":"Java Programmer","gender":"male","salary": 32000}
PUT /meituan_employee/_doc/13
{"name" : "Jonthna","age":30,"job":"Java Programmer","gender":"female","salary":30000 }
PUT /m