Elasticsearch 時間分組聚合查詢
阿新 • • 發佈:2018-12-18
正常業務邏輯中,會出現大量的資料統計,比如說分組聚合查詢,根據天進行資料的統計,記錄下es分組聚合查詢
{
"size": 0,
"aggs": {
"groupDate": {
"date_histogram": {
"field": "create_date",
"interval": "day",
"format": "yyyy-MM-dd"
}
}
}
}
此處使用按天分組,可用的時間間隔表示式:year, quarter, month, week, day, hour, minute, second(年份、季度、月、周、日、小時、分鐘、秒)。
{
"size": 0,
"aggs": {
"groupDate": {
"date_histogram": {
"field": "create_date",
"interval": "90m",
"format": "yyyy-MM-dd"
}
}
}
}
此處也可以根據小時分組,1.5h則用分鐘來表示(90m)
上面是官方提供的方法,size屬性可以控制是否返回聚合的資料結果集,因為我們設定了 size 引數,所以不會有 hits 搜尋結果返回。
{
"aggregations ":{
"groupDate":{
"buckets":[
{
"key_as_string":"2018-08-28",
"key":1535430600000,
"doc_count":590000
},
{
"key_as_string":"2018-08-28",
"key":1535436000000 ,
"doc_count":470000
}
]
}
}
}
groupDate 聚合是作為 aggregations 欄位的一部分被返回的,每一個 key 都與分組條件對應,我這裡是根據1.5小時分組,key 將會顯示分組的時間,doc_count 欄位,將會告訴我們包含此項的文件數量。
下面是根據官方文件給出的api呼叫方式:
// 宣告where 條件
BoolQueryBuilder qbs = QueryBuilders.boolQuery();
AggregationBuilder aggregation = AggregationBuilders.dateHistogram("agg").field("create_time")
.interval(DateHistogramInterval.DAY).format("yyyy-MM-dd");
SearchRequestBuilder requestBuilder = client.prepareSearch("user_login_detail")
.setTypes("login_detail");
requestBuilder.setQuery(qbs);
requestBuilder.addAggregation(aggregation);
SearchResponse response = requestBuilder.execute().actionGet();
Histogram agg = response.getAggregations().get("agg");
// For each entry
for (Histogram.Bucket entry : agg.getBuckets()) {
String key = StringUtil.nullBlank(entry.getKey());
String keyAsString = entry.getKeyAsString();
long docCount = entry.getDocCount();
System.out.println("key [{" + keyAsString + "}]");
System.out.println("date [{" + key + "}]");
System.out.println("doc_count [{" + docCount + "}]");
}
DateHistogramInterval.DAY 方法提供根據天分組或者是根據時間間隔分組