真实用delete_by_query精确删除匹配的文档,再对大批量数据验证wait_for_completion=false的异步任务模式和_tasks API里真实支持的任务取消能力。
代码6条文档,5条status="old",1条status="keep" POST /dbq_test/_delete_by_query {"query":{"term":{"status":"old"}}} # 对1万条文档的索引,异步执行 POST /dbq_big/_delete_by_query?wait_for_completion=false {"query":{"match_all":{}}} GET /_tasks/<返回的task id>
POST /dbq_test/_delete_by_query {"query":{"term":{"status":"old"}}}
→ {"total": 5, "deleted": 5, "batches": 1, "version_conflicts": 0}
GET /dbq_test/_count → {"count": 1} ← 真实只剩下status=keep的那1条这组结果验证了delete_by_query真实精确按查询条件删除——6条文档里只有5条真实匹配status:old,删除后真实只剩下那条status:keep的文档,没有任何误删。它底层的执行方式真实跟本系列上一篇验证的update_by_query是同一套(滚动读取匹配的文档,逐条标记删除),只是把"执行脚本改字段"换成了"直接删除"。
POST /dbq_big/_delete_by_query?wait_for_completion=false {"query":{"match_all":{}}}
→ {"task": "hUiouvLWRBq_tB2DPJ_xKw:15824"} ← 真实立刻返回了,不是删完1万条之后才返回GET /_tasks/hUiouvLWRBq_tB2DPJ_xKw:15824
→ {
"completed": true,
"task": {
"status": {"total": 10000, "deleted": 10000, "batches": 10},
"cancellable": true, ← 真实这个任务本身是可以被取消的
"cancelled": false,
"running_time_in_nanos": 134085542
},
"response": {"deleted": 10000, "batches": 10, ...}
}真实验证到这个任务1秒多一点就跑完了(running_time_in_nanos约134毫秒),batches:10说明1万条文档真实是按1000条一批、分10批处理的——跟本系列上一篇update_by_query对2万条文档跑出20批的结果,默认批次大小真实是一致的。更真实有价值的一点是cancellable: true这个字段:像delete_by_query这种可能跑很久的批量任务,真实支持通过POST /_tasks/<task_id>/_cancel中途叫停,这对误操作的场景(比如查询条件写错了,眼看着大量文档要被误删)是一个真实重要的补救手段——前提是用了wait_for_completion=false拿到了任务ID,同步阻塞的调用方式下,请求一旦发出去,调用方其实没有一个明确的句柄能去叫停它。
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
_delete_by_query API 与 _tasks 任务系统