ElasticSearch 备考 -- Aggregations

一、题目

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中的通过 ">>" 代表路径指向方向


参考资料

送一波福利:

福利一

有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!

有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!

有需要内推JD的同学,可以私信或留言,我帮您内推,流程快!!!

福利二

福利三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值