一、题目
earthquakes索引,包含了过去11个月的地震信息,请查询获取以下信息
● 过去11个月,每个月的平均地震等级(magiitude)
● 过去11个月里,平均地震等级最高的一个月及其平均地震等级
● 搜索不能返回任何文档
二、思考
这个主要考点是聚合查询Aggs
我们要知道聚合包括三大块内容,分别为
- metric 指标聚合,包括总和sum、平均avg、最大max、最小min等
- bucket 分桶聚合,可以同SQL理解为分组group,例如区间range、日期区间date range
- pipeline 子聚合,可以理解成在聚合的基础上再进步一聚合
分析题题目
1)每个月,DateTime为日期类型,要按月聚合,可以使用日期直方图 date_histogram
2)每个月平均,在日期直方图的基础上计算平均值 avg
3)在过去11月里,求最大值,这里是在前两个聚合的基础上,即使用子聚合 pipline
4)不能访问任何文档,即设置查询的返回的大小,size=0
三、解题
Step 1、初始化索引和数据
# DELETE earthquakes
PUT earthquakes
{
"mappings": {
"properties": {
"DateTime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"Magnitude": {
"type": "float"
}
}
}
}
POST earthquakes/_bulk
{"index":{"_id":1}}
{"DateTime":"2016-01-01 12:12:12", "Magnitude":4.56}
{"index":{"_id":2}}
{"DateTime":"2016-01-01 15:12:12", "Magnitude":6.46}
{"index":{"_id":3}}
{"DateTime":"2016-02-02 13:12:12", "Magnitude":4}
{"index":{"_id":4}}
{"DateTime":"2016-03-02 13:12:12", "Magnitude":6}
Step 2、编写聚合查询模版
注意:
1)搜索不能返回任何文档,转换就是size=0
2)这里在总结一下层级,query、aggs、size、sort、highlight 都是平级的
POST earthquakes/_search
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"NAME": {
"AGG_TYPE": {}
}
}
}
Step 3、处理查询条件1
查询过去11个月,每个月的平均地震等级(magiitude)
1)因为前面说索引包括过去11的文档,所以就是全部内容,所以query可以不写,或者写成query match all
2)”每个月“是考的是日期直方图,date histogram,filed指定的是按照那个字段,calendar_interval 指定间隔,因为要求每个月即 month。
3)每个月平均,就是在日期直方图的基础上再计算出平均值。平均值是avg
POST earthquakes/_search
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"eary_month": {
"date_histogram": {
"field": "DateTime",
"calendar_interval": "month"
},
"aggs": {
"avg_magnitude": {
"avg": {
"field": "Magnitude"
}
}
}
}
}
}
Step 4、处理查询条件2
过去11个月里,平均地震等级最高的一个月及其平均地震等级
通过分析是基于上面两个聚合,基础上获取最大一个,这里应该使用pipeline中的max_bucket.
这里需要说明一下,">>" 路径指向,告诉es从那个路径下获取最大
POST earthquakes/_search
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"every_month": {
"date_histogram": {
"field": "DateTime",
"calendar_interval": "month"
},
"aggs": {
"avg_magnitude": {
"avg": {
"field": "Magnitude"
}
}
}
},
"max_monthly": {
"max_bucket": {
"buckets_path": "every_month>>avg_magnitude"
}
}
}
}
四、总结
1)对于聚合首先脑子里要一个总体的分类,即matrix、bucket、pipeline
2)对于每个分类代表的含义是什么要清晰,分类下常用集合
3)在日常使用中聚合通常是不需要获取结果,要把size设为0,这样可以提升查询性能
4)pipeline中的通过 ">>" 代表路径指向方向
参考资料
- Aggregations | Elasticsearch Guide [8.1] | Elastic
- Avg aggregation | Elasticsearch Guide [8.1] | Elastic
- Date histogram aggregation | Elasticsearch Guide [8.1] | Elastic
- Max bucket aggregation | Elasticsearch Guide [8.1] | Elastic
送一波福利:
福利一
有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!
有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!
有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!
福利二
福利三