正常的Elasticserach的时间戳字段按照天进行聚合应该是很简单的(date_histogram),代码如下:
{
"aggs":{
"create_date":{//别名
"date_histogram":{
"field":"create_time",//时间戳字段
"interval":"Day",
"format":"yyyy-MM-dd"//格式化日期
}
}
}
}
}
interval字段支持多种关键字:year
, quarter
, month
, week
, day
, hour
, minute
, second
出来的结果会是以下这种:
{
"aggregations":{
"create_date":{
"buckets":[{
"key_as_string":"2013-02-02",
"key":1328140800000,
"doc_count":1
},{
"key_as_string":"2013-02-03",
"key":1330646400000,
"doc_count":2
},
...
]}
}
}
然而,对于PHP来说,time()精确到秒,而java和Elasticsearch是精确到毫秒,所以聚合出来的时候会发现所有的key_as_string字段都是1970开头的...因为考虑到表中增加字段比较麻烦,所以找到了可以利用script来实现,将PHP的时间戳乘以1000即可,方法如下:
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"mid": "33"
}
}
]
}
}
}
},
"aggs": {
"group_by_date": {
"terms": {
"script": "new Date(doc['created_time'].value * 1000).format('yyyy-MM-dd')"
}
}
}
}
这样聚合出来就是按照天进行聚合了。