首先是介绍:
能干什么:
聚合查询可以很方便的实现对数据的统计,分析例如:
什么品牌的衣服最受欢迎
这些衣服的平均价格,最高最低价格
这些衣服每个月的销售情况
而且实现这些功能比数据库的sql要方便很多,而且速度也恒快,可以近实时搜索结果
基本概念
es中的聚合,包含多种类型,最常用的有俩种一个叫桶,一个叫度量:
- 桶(bocket)
桶是按照某种方式对数据进行分组,每组数据在es中被称为一个桶,例如:根据国籍对人进行划分,可以分为中国籍,韩国籍,日本籍。。。或者可以根据年龄段对人进行划分。。。
es中划分桶的方式有很多种:
- date historram aggregations:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
- historram aggregations:根据数值阶梯分组,与日期类似,以间隔分组,需要指定间隔
- terms aggregations:根据词条内容分组,词条内容完全匹配为一组
- range aggregations:数值和日期范围分组,指定开始和结束,然后按段分组
- 。。。。。
桶只对数据进行分组,并不进行计算,所以桶聚合中一般会嵌套另一种聚合 度量(metrics aggregations)
- 度量(metrics aggregations)
- Avg aggregations;求平均值
- Max aggregations;求最大值
- min aggregations:求最小值
- percentiles aggregations:求百分比
- stats aggregations:同时返回avg,min,max,sum,count等
- sum aggregations:求和
- top hits aggregations:求前几
- value count aggregations:求总数
- 。。。。。。。
测试聚合:
首先把索引库和数据准备好:
创建索引库cars
PUT /cars
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"transactions":{
"properties": {
"color":{
"type":"keyword"
},
"make":{
"type":"keyword"
}
}
}
}
}
批量导入数据:
这里_bulk表示批量导入数据。
POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
对cars的make字段进行聚合
GET /cars/_search
{
"aggs": {
"popular_brand": { 聚合名字自己起名
"terms": { 聚合方式,根据词条进行分组
"field": "make", 分组字段,
"size": 10 最多组数量
}
}
}
}
结果:
发现把数据也查询出来了,如果不希望查询出来数据可以:
GET /cars/_search
{
"size": 0, 分页的操作,size表示显示多少条,这里写为0就不显示数据了
"aggs": {
"popular_brand": {
"terms": {
"field": "make",
"size": 10
}
}
}
}
计算每个品牌的汽车平均价格
GET /cars/_search
{
"size": 0,
"aggs": {
"popular_brand": {
"terms": {
"field": "make",
"size": 10
},
"aggs": { 使用上面的terms聚合成桶后,在使用这个度量计算每个品牌的平均价格
"price_avg": {
"avg": {
"field": "price"
}
}
}
}
}
}