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

如何高效删除ElasticSearch中的文档?是否支持分页删除?

分页删除旧文档可行方案

针对你提到的100万量级索引、新增后清理旧文档的场景,完全有成熟可落地的分页删除方案,核心要规避普通分页查询的深分页性能损耗,推荐两种常用方案:

方案1:滚动查询+批量手动删除

适合需要自己控制删除节奏、要对删除结果做额外校验的场景:

  • 先构造匹配旧数据的查询条件,包含指定参数、刷新时间戳阈值、其他筛选字段
  • 初始化滚动查询,设置滚动上下文有效期(建议15分钟,根据单批处理时长调整),每批返回文档数设置为10005000,按集群负载灵活调整
  • 拿到每批返回的文档ID列表后,调用_bulk接口批量执行删除操作
  • 循环调用滚动接口拉取下一批数据,直到无数据返回后手动清理滚动上下文即可

参考命令示例:

# 初始化滚动查询,按_doc排序效率最高
POST /你的索引名/_search?scroll=2m&size=2000
{
  "query": {
    "bool": {
      "filter": [
        {"term": {"你的筛选字段": "指定参数"}},
        {"range": {"刷新时间戳字段名": {"lt": 本次刷新的时间戳阈值}}}
      ]
    }
  },
  "sort": ["_doc"]
}

# 批量删除拿到的文档ID,循环执行直到无数据返回
POST /_bulk
{"delete":{"_index":"你的索引名","_id":"文档1ID"}}
{"delete":{"_index":"你的索引名","_id":"文档2ID"}}

方案2:原生_delete_by_query 自动分批删除

适合不想自己处理分页逻辑、追求开发效率的场景,ES原生接口内置了分批执行能力:

  • 直接把匹配旧数据的查询条件写入_delete_by_query请求体
  • 通过scroll_size参数控制每批删除的文档数,默认值为1000,可调整为2000~3000适配集群性能
  • 担心请求超时的话可以加wait_for_completion=false参数让任务后台异步执行,通过返回的任务ID可随时查询执行进度

参考命令示例:

POST /你的索引名/_delete_by_query?scroll_size=2000&wait_for_completion=false
{
  "query": {
    "bool": {
      "filter": [
        {"term": {"你的筛选字段": "指定参数"}},
        {"range": {"刷新时间戳字段名": {"lt": 本次刷新的时间戳阈值}}}
      ]
    }
  }
}

实用注意事项

  • 删除操作会占用磁盘IO,建议放在业务低峰期执行,避免影响线上正常读写请求
  • 100万量级的索引就算全量删除,按每批2000算仅需500次左右请求,执行效率很高,无需担心耗时过长
  • 如果你要删除的旧数据占索引总数据量的50%以上,更推荐把需要保留的新数据reindex到新索引,再切换别名指向新索引,整体效率比逐条删除高很多

内容的提问来源于stack exchange,提问作者Rajat Tanwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:27:04