正常的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')" } } }}
这样聚合出来就是按照天进行聚合了。