Delete by Query

Delete by Query #

Delete by Query 删除所有匹配查询条件的文档。 适用于批量清理过期数据、删除特定条件的文档等场景。

内部流程:scroll 遍历匹配文档 → 逐批执行 bulk delete → 返回统计结果。


请求格式 #

POST /<index>/_delete_by_query

路径参数 #

参数必需说明
<index>目标索引,支持逗号分隔多索引和通配符

查询参数 #

参数类型默认值说明
refreshbooleanfalse操作完成后是否刷新受影响的分片
timeouttime1m超时时间
wait_for_completionbooleantruetrue 时同步等待;为 false 时立即返回 task ID
wait_for_active_shardsstring操作前需要的活跃分片数量
requests_per_secondfloat无限制每秒请求数限制。-1 = 不限制
slicesint/string1并行切片数。"auto" = 按分片数自动拆分
scrolltimescroll 上下文存活时间
scroll_sizeint1000每批 scroll 获取的文档数
conflictsstringabort版本冲突处理:abort = 中止;proceed = 跳过继续
max_docsint全部最多删除的文档数量
search_timeouttime搜索阶段超时
qstring简单查询字符串
dfstringq 参数的默认字段
default_operatorstringORq 参数的默认运算符
analyzerstringq 参数使用的分析器
analyze_wildcardbooleanfalse是否分析通配符
lenientboolean宽松解析模式
routingstring路由值
preferencestring查询偏好
terminate_afterint0每分片最多处理的文档数
expand_wildcardsstringopen通配符展开方式
ignore_unavailablebooleanfalse忽略不存在的索引
allow_no_indicesbooleantrue允许通配符不匹配任何索引

请求体 #

{
  "query": { ... },
  "max_docs": 1000,
  "conflicts": "proceed"
}
字段类型说明
queryobject筛选条件,语法同 Query DSL必需
max_docsint最多删除的文档数
conflictsstring冲突处理策略

示例 #

基本用法 #

删除所有 status"expired" 的文档:

POST /website/_delete_by_query
{
  "query": {
    "term": { "status": "expired" }
  }
}

删除索引中的所有文档 #

POST /website/_delete_by_query
{
  "query": { "match_all": {} }
}

如果需要清空整个索引,删除并重建索引通常比 delete_by_query 更高效。

使用查询字符串 #

POST /website/_delete_by_query?q=status:expired

跳过版本冲突 #

并发场景下,其他进程可能同时修改了文档。设置 conflicts=proceed 跳过冲突继续删除:

POST /website/_delete_by_query?conflicts=proceed
{
  "query": {
    "range": {
      "date": { "lt": "2023-01-01" }
    }
  }
}

流量控制 #

限制每秒处理 200 条,降低集群负载:

POST /website/_delete_by_query?requests_per_second=200
{
  "query": {
    "term": { "status": "archived" }
  }
}

异步执行 #

POST /website/_delete_by_query?wait_for_completion=false
{
  "query": {
    "range": { "date": { "lt": "2022-01-01" } }
  }
}

响应返回 task ID:

{
  "task": "node_id:task_id"
}

查询进度:

GET /_tasks/node_id:task_id

并行切片 #

POST /website/_delete_by_query?slices=auto
{
  "query": {
    "term": { "status": "expired" }
  }
}

限制删除数量 #

最多删除 1000 条匹配文档:

POST /website/_delete_by_query
{
  "query": { "match_all": {} },
  "max_docs": 1000
}

响应字段 #

{
  "took":                 83,
  "timed_out":            false,
  "total":                100,
  "deleted":              100,
  "batches":              1,
  "version_conflicts":    0,
  "noops":                0,
  "retries": {
    "bulk":   0,
    "search": 0
  },
  "failures": []
}
字段说明
took操作耗时(毫秒)
total匹配的文档总数
deleted成功删除的文档数
version_conflicts版本冲突次数
noops无操作次数
batchesscroll 批次数
retries.bulkbulk 重试次数
retries.searchsearch 重试次数
failures失败详情数组

参考导航 #

需求参见
单条文档删除Delete API
按查询条件批量更新Update by Query
跨索引迁移数据Reindex
数据生命周期管理数据生命周期与保留策略