date_histogram的使用
date_histogram是按照时间来构建集合(桶)Buckts的,当我们需要按照时间进行做一些数据统计的时候,就可以使用它来进行时间维度上构建指标分析.
在前面几篇中我们用到的hitogram也是可以处理日期的,但是,它不能自动识别日期,只会把日期看做
是数字,在聚合的时候是不知道日历时间间隔.
- 本节使用案例的例子还是前面文章中使用的数据ElasticSearch超强聚合查询(一)
案例一: 每月销售多少台汽车?
- 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");
}
- 最终获得连续的图表: