You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Elasticsearch查询:筛选各task ID最新且E为null的记录

Elasticsearch 查询实现:获取每个任务最新记录并筛选未完成项

要实现“按任务ID分组取最新记录,再筛选出标记为null的记录”,可以通过聚合+桶筛选的方式完成,以下是具体实现方案:

核心思路

  1. 按任务ID(字段C)分组,确保每个任务单独成组;
  2. 每组内按时间戳(字段D)降序排序,取第一条记录(即最新记录);
  3. 筛选出最新记录中标记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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:05:36