es 时间字段聚合_es Elasticsearch 时间分组聚合查询

时间:2025-04-24 08:57:53

正常业务逻辑中,会出现大量的数据统计,比如说分组聚合查询,根据天进行数据的统计,记录下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 = ();

AggregationBuilder aggregation = ("agg").field("create_time")

.interval().format("yyyy-MM-dd");

SearchRequestBuilder requestBuilder = ("user_login_detail")

.setTypes("login_detail");

(qbs);

(aggregation);

SearchResponse response = ().actionGet();

Histogram agg = ().get("agg");

// For each entry

for ( entry : ()) {

String key = (());

String keyAsString = ();

long docCount = ();

("key [{" + keyAsString + "}]");

("date [{" + key + "}]");

("doc_count [{" + docCount + "}]");

}

方法提供根据天分组或者是根据时间间隔分组

————————————————

版权声明:本文为****博主「不要忘记当初的目标」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:/jianshaoguang8886/article/details/82178817