Elasticsearch 入门教程 – Date Histogram聚合

Elasticsearch的聚合主要分成两大类:metric和bucket,2.0中新增了pipeline还没有研究。本篇还是来介绍Bucket聚合中的常用聚合——date histogram.参考:官方文档

用法

Date histogram的用法与histogram差不多,只不过区间上支持了日期的表达式。

{
"aggs":{
   "articles_over_time":{
       "date_histogram":{
           "field":"date",
           "interval":"month"
           }
       }
   }
}

interval字段支持多种关键字:`year`, `quarter`, `month`, `week`, `day`, `hour`, `minute`, `second`

当然也支持对这些关键字进行扩展使用,比如一个半小时可以定义成如下:

{
   "aggs":{
       "articles_over_time":{
           "date_histogram":{
               "field":"date",
               "interval":"1.5h"
               }
           }
       }
}

返回的结果可以通过设置format进行格式化:

{
   "aggs":{
       "articles_over_time":{
           "date_histogram":{
               "field":"date",
               "interval":"1M",
               "format":"yyyy-MM-dd"
               }
           }
       }
   }

得到的结果如下:

{
   "aggregations":{
       "articles_over_time":{
           "buckets":[{
               "key_as_string":"2013-02-02",
               "key":1328140800000,
               "doc_count":1
           },{
               "key_as_string":"2013-03-02",
               "key":1330646400000,
               "doc_count":2
           },
           ...
           ]}
       }
}

其中key_as_string是格式化后的日期,key显示了是日期时间戳,

time_zone时区的用法

在es中日期支持时区的表示方法,这样就相当于东八区的时间。

{
   "aggs":{
       "by_day":{
           "date_histogram":{
               "field":"date",
               "interval":"day",
               "time_zone":"+08:00"
           }
       }
   }
}

offset 使用偏移值,改变时间区间

默认情况是从凌晨0点到午夜24:00,如果想改变时间区间,可以通过下面的方式,设置偏移值:

{"aggs":{
   "by_day":{
       "date_histogram":{
           "field":"date",
           "interval":"day",
           "offset":"+6h"
           }
       }
   }
}

那么桶的区间就改变为:

"aggregations":{    
    "by_day":{        
          "buckets":[{
              "key_as_string":"2015-09-30T06:00:00.000Z",
               "key":1443592800000,
               "doc_count":1
            },
            {
              "key_as_string":"2015-10-01T06:00:00.000Z",
               "key":1443679200000,  
               "doc_count":1
       }]
   }
}

Missing Value缺省字段

当遇到没有值的字段,就会按照缺省字段missing value来计算:

{
   "aggs":{
       "publish_date":{
           "date_histogram":{
               "field":"publish_date",
               "interval":"year",
               "missing":"2000-01-01"
           }
       }
   }
}

Java代码:

1.	DateHistogramBuilder dateAgg = AggregationBuilders.dateHistogram("dateAgg");//取名字  
2.	        dateAgg.field("time");     //设置聚合字段  
3.	        dateAgg.interval(DateHistogram.Interval.YEAR);  
4.	        //dateAgg.interval(DateHistogram.Interval.QUARTER);  
5.	        //dateAgg.interval(DateHistogram.Interval.MONTH);  
6.	        //dateAgg.interval(DateHistogram.Interval.weeks(2));  
7.	        //dateAgg.interval(DateHistogram.Interval.days(1));  
8.	        //dateAgg.interval(DateHistogram.Interval.hours(2));  
9.	        //dateAgg.interval(DateHistogram.Interval.minutes(5));  
10.	        //dateAgg.interval(DateHistogram.Interval.seconds(10));  
11.	        dateAgg .format("yyyy-MM-dd")       //设置聚合日期格式  
12.	                .minDocCount(0)              //设置聚合后最小值,防止聚合数为0时得到的结果没有该项  
13.	                .extendedBounds(beginDate, endDate);    //强制设置时间范围  
   然后在elasticsearch中开始聚合:
1.	SearchResponse response = client.prepareSearch()  
2.	                .addAggregation("dateAgg")  
3.	                .execute().actionGet();  
4.	        Map<String, Long> logNumByDay = new HashMap<String, Long>();  
5.	        DateHistogram aggByDay = response.getAggregations().get("dateAgg");  //得到聚合后的桶  
6.	        for(DateHistogram.Bucket logByDay : aggByDay.getBuckets())           //遍历桶  
7.	        {  
8.	            logNumByDay.put(logByDay.getKey(),logByDay.getDocCount());       //对每个桶取信息构造键值对  
9.	        }

发表评论