Elasticsearch 聚合查询(三)空buckts以及date_histogram的使用

 

date_histogram的使用

date_histogram是按照时间来构建集合(桶)Buckts的,当我们需要按照时间进行做一些数据统计的时候,就可以使用它来进行时间维度上构建指标分析. 
在前面几篇中我们用到的hitogram也是可以处理日期的,但是,它不能自动识别日期,只会把日期看做 
是数字,在聚合的时候是不知道日历时间间隔.

案例一: 每月销售多少台汽车?

  • http请求
GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {//日期分析函数
            "field": "sold",
            "interval": "month", //以一个月为间隔单位
            "format": "yyyy-MM-dd" 
         }
      }
   }
}
  • java-api请求
    @Test
    public void dateHistogram(){
        SearchResponse response = transportClient.prepareSearch("cars")
                .setTypes("transactions")
                .addAggregation(
                        AggregationBuilders.dateHistogram("sales")
                            .field("sold")
                            .dateHistogramInterval(DateHistogramInterval.MONTH)
                            .format("yyyy-MM-dd")
                )
                .setSize(0)
                .get();
    }
  • 返回结果
{
   ...
   "aggregations": {
      "sales": {
         "buckets": [
            {
               "key_as_string": "2014-01-01",
               "key": 1388534400000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-02-01",
               "key": 1391212800000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-05-01",
               "key": 1398902400000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-07-01",
               "key": 1404172800000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-08-01",
               "key": 1406851200000,
               "doc_count": 1
            },
            {
               "key_as_string": "2014-10-01",
               "key": 1412121600000,
               "doc_count": 1
            },
             {
               "key_as_string": "2014-11-01",
               "key": 1414800000000,
               "doc_count": 2
            }
         ]
...
}
  • 在上面的例子中,在返回的结果可以看到9月份的数据没有,但是有时候我们需要9月份的数据,只要为空就行,这样有利于前台页面的渲染.于是我们可以如下设置

返回空的buckets

  • http 代码:
GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "month",
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, //可以返回没有数据的月份
            "extended_bounds" : { //强制返回数据的范围
                "min" : "2014-01-01",
                "max" : "2014-12-31"
            }
         }
      }
   }
}
  • java-api代码:
    @Test
    public void dateHistogram(){
        SearchResponse response = transportClient.prepareSearch("cars")
                .setTypes("transactions")
                .addAggregation(
                        AggregationBuilders.dateHistogram("sales")
                            .field("sold")
                            .dateHistogramInterval(DateHistogramInterval.MONTH)
                            .format("yyyy-MM-dd")
                            .minDocCount(0l)
                            .extendedBounds(
                                new ExtendedBounds("2014-01-01","2014-12-31")
                            )
                )
                .setSize(0)
                .get();
        Aggregation sales = response.getAggregations().get("sales");
    }
  • 最终获得连续的图表: 
    折线图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值