Elasticsearch 按秒分组查询获取每秒第一条完整记录的方法
Elasticsearch 按秒分组取秒内第一条记录实现方案
你遇到的问题是date_histogram默认仅返回桶的统计信息,没有关联桶内完整文档,搭配top_hits子聚合即可实现需求,参考DSL如下:
GET /你的索引名/_search { "size": 0, // 不返回原始查询命中列表,仅返回聚合结果 "query": { // 此处可以添加你的自定义过滤条件,比如时间范围过滤 "match_all": {} }, "aggs": { "group_by_second": { "date_histogram": { "field": "timestamp", "fixed_interval": "1s", // 按秒分组 "format": "yyyy-MM-dd'T'HH:mm:ssZ" }, "aggs": { "first_record_per_second": { "top_hits": { "size": 1, // 每个桶仅返回1条 "sort": [ { "timestamp": { "order": "asc" // 按时间升序,取该秒内最早的第一条记录 } } ], "_source": true // 返回完整的文档字段,也可以指定要返回的字段数组减少数据量 } } } } } }
结果解析
返回的聚合结果中,aggregations.group_by_second.buckets数组的每一项对应一个秒级时间桶,取每个桶下的first_record_per_second.hits.hits[0]._source即可得到该秒的第一条完整记录。
可选优化
如果你的查询数据量较大,单聚合返回的桶数超过默认限制,可以在请求中添加"track_total_hits": false减少统计开销,同时按需调整top_hits的_source参数仅返回你需要的字段,降低数据传输量。
内容的提问来源于stack exchange,提问作者Basil the dev
相关产品推荐
相关产品推荐

