1. 程式人生 > >Elasticsearch 時間分組聚合查詢

Elasticsearch 時間分組聚合查詢

正常業務邏輯中,會出現大量的資料統計,比如說分組聚合查詢,根據天進行資料的統計,記錄下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 方法提供根據天分組或者是根據時間間隔分組這裡寫圖片描述