如何编写Elasticsearch查询:筛选各task ID最新且E为null的记录
Elasticsearch 查询实现:获取每个任务最新记录并筛选未完成项
要实现“按任务ID分组取最新记录,再筛选出标记为null的记录”,可以通过聚合+桶筛选的方式完成,以下是具体实现方案:
核心思路
- 按任务ID(字段
C)分组,确保每个任务单独成组; - 每组内按时间戳(字段
D)降序排序,取第一条记录(即最新记录); - 筛选出最新记录中标记
E为null的分组。
完整查询DSL
{ "size": 0, "aggs": { "group_by_task": { "terms": { "field": "C.keyword", "size": 10000 // 设为足够大的值,覆盖所有任务ID数量 }, "aggs": { "latest_record": { "top_hits": { "size": 1, "sort": [{"D": {"order": "desc"}}], "_source": ["C", "D", "E"] // 指定返回需要的字段 } }, "filter_unfinished": { "bucket_selector": { "buckets_path": { "flag_value": "latest_record.hits.hits[0]._source.E" }, "script": "params.flag_value == null" } } } } } }
代码说明
size: 0:关闭原始搜索结果返回,只输出聚合结果,减少数据传输;group_by_task:使用terms聚合按任务ID分组,C.keyword确保按字符串精确匹配(若C是数字类型则直接用C);latest_record:通过top_hits聚合获取每组内时间戳最大的记录,sort参数指定按D降序,size:1只取第一条;filter_unfinished:使用bucket_selector聚合筛选出最新记录中E为null的分组,最终仅保留符合条件的任务最新记录。
结果说明
执行查询后,聚合结果中的group_by_task.buckets下的每个bucket对应一个符合条件的任务,其latest_record.hits.hits[0]即为该任务的最新未完成记录,对应示例中的第6行(id:2, time:3, E:null)和第8行(id:3, time:2, E:null)。
内容的提问来源于stack exchange,提问作者skw
相关产品推荐
相关产品推荐

