Elasticsearch文档删除 #

一、单文档删除 #

1.1 基本删除 #

bash
DELETE /products/_doc/1

响应:

json
{
  "_index": "products",
  "_id": "1",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}

1.2 删除不存在的文档 #

bash
DELETE /products/_doc/999

响应:

json
{
  "_index": "products",
  "_id": "999",
  "result": "not_found",
  "status": 404
}

1.3 删除参数 #

参数 说明 默认值
refresh 是否刷新 false
routing 路由值 -
timeout 超时时间 1m
if_seq_no 序列号 -
if_primary_term 主分片任期 -
version 版本号 -

1.4 使用routing删除 #

bash
DELETE /products/_doc/1?routing=apple

1.5 乐观并发控制删除 #

bash
DELETE /products/_doc/1?if_seq_no=0&if_primary_term=1

二、批量删除 #

2.1 使用Bulk API #

bash
POST /_bulk
{"delete": {"_index": "products", "_id": "1"}}
{"delete": {"_index": "products", "_id": "2"}}
{"delete": {"_index": "products", "_id": "3"}}

2.2 批量响应 #

json
{
  "took": 15,
  "errors": false,
  "items": [
    {
      "delete": {
        "_index": "products",
        "_id": "1",
        "status": 200,
        "result": "deleted"
      }
    },
    {
      "delete": {
        "_index": "products",
        "_id": "2",
        "status": 200,
        "result": "deleted"
      }
    }
  ]
}

三、Delete By Query #

3.1 基本用法 #

bash
POST /products/_delete_by_query
{
  "query": {
    "term": {
      "status": "deleted"
    }
  }
}

响应:

json
{
  "took": 150,
  "timed_out": false,
  "total": 100,
  "deleted": 100,
  "batches": 1,
  "version_conflicts": 0,
  "failures": []
}

3.2 条件删除 #

按时间范围删除

bash
POST /logs/_delete_by_query
{
  "query": {
    "range": {
      "@timestamp": {
        "lt": "2024-01-01"
      }
    }
  }
}

按字段值删除

bash
POST /products/_delete_by_query
{
  "query": {
    "bool": {
      "must": [
        { "term": { "brand": "OldBrand" } },
        { "range": { "created_at": { "lt": "2023-01-01" } } }
      ]
    }
  }
}

删除所有文档

bash
POST /products/_delete_by_query
{
  "query": {
    "match_all": {}
  }
}

3.3 多索引删除 #

bash
POST /logs-2024-*/_delete_by_query
{
  "query": {
    "term": {
      "level": "debug"
    }
  }
}

3.4 删除参数 #

参数 说明 默认值
conflicts 冲突处理(abort/continue) abort
refresh 是否刷新 false
wait_for_completion 是否等待完成 true
timeout 超时时间 -
scroll_size 每批处理数量 1000
slices 并行切片数 1

3.5 处理冲突 #

bash
POST /products/_delete_by_query?conflicts=proceed
{
  "query": {
    "term": {
      "status": "deleted"
    }
  }
}

3.6 异步执行 #

bash
POST /products/_delete_by_query?wait_for_completion=false
{
  "query": {
    "range": {
      "created_at": {
        "lt": "2023-01-01"
      }
    }
  }
}

响应:

json
{
  "task": "node_id:12345"
}

查看任务状态:

bash
GET /_tasks/node_id:12345

3.7 取消任务 #

bash
POST /_tasks/node_id:12345/_cancel

3.8 切片并行删除 #

bash
POST /products/_delete_by_query?slices=5
{
  "query": {
    "term": {
      "status": "deleted"
    }
  }
}

四、删除索引 #

4.1 删除单个索引 #

bash
DELETE /products

4.2 删除多个索引 #

bash
DELETE /index1,index2

DELETE /logs-2024-*

4.3 删除所有索引 #

bash
DELETE /_all

DELETE /*

安全建议:禁用删除所有索引:

yaml
action.destructive_requires_name: true

五、删除与关闭索引 #

5.1 关闭索引 #

bash
POST /products/_close

关闭后:

  • 数据保留
  • 无法读写
  • 节省资源

5.2 打开索引 #

bash
POST /products/_open

5.3 选择建议 #

场景 操作
数据不再需要 删除索引
数据暂时不用 关闭索引
数据需要归档 关闭后备份

六、软删除 #

6.1 软删除实现 #

bash
POST /products/_update/1
{
  "script": {
    "source": "ctx._source.deleted = true"
  }
}

查询时排除已删除:

bash
GET /products/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "term": { "deleted": true } }
      ]
    }
  }
}

6.2 软删除优势 #

text
软删除优势
├── 可恢复
│   └── 误删可恢复
├── 审计追踪
│   └── 保留删除记录
├── 数据一致性
│   └── 避免关联数据问题
└── 性能
    └── 批量删除更快

6.3 定期清理 #

bash
POST /products/_delete_by_query
{
  "query": {
    "bool": {
      "must": [
        { "term": { "deleted": true } },
        { "range": { "deleted_at": { "lt": "now-30d" } } }
      ]
    }
  }
}

七、删除性能优化 #

7.1 批量删除优化 #

text
优化建议
├── 使用Delete By Query
│   └── 批量删除更高效
├── 设置slices
│   └── 并行删除
├── 调整scroll_size
│   └── 合适的批次大小
├── 禁用refresh
│   └── 删除完成后刷新
└── 异步执行
    └── 大批量删除

7.2 删除后优化 #

bash
POST /products/_forcemerge?only_expunge_deletes=true

说明:删除操作只是标记文档为已删除,实际数据仍占用空间,force merge可以清理已删除文档。

八、删除监控 #

8.1 查看删除统计 #

bash
GET /products/_stats

关注字段:

json
{
  "indices": {
    "products": {
      "primaries": {
        "docs": {
          "count": 1000,
          "deleted": 50
        }
      }
    }
  }
}

8.2 查看段信息 #

bash
GET /products/_segments

九、删除错误处理 #

9.1 常见错误 #

错误 原因 解决方案
version_conflict_engine_exception 版本冲突 使用retry_on_conflict
document_missing_exception 文档不存在 检查文档ID
index_not_found_exception 索引不存在 先创建索引
illegal_argument_exception 参数错误 检查参数

9.2 错误响应示例 #

json
{
  "error": {
    "root_cause": [
      {
        "type": "version_conflict_engine_exception",
        "reason": "[1]: version conflict, current document has seq_no [1]"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[1]: version conflict, current document has seq_no [1]"
  },
  "status": 409
}

十、删除策略 #

10.1 时间序列数据 #

text
日志数据删除策略
├── 使用ILM
│   ├── hot阶段:写入
│   ├── warm阶段:只读
│   ├── cold阶段:归档
│   └── delete阶段:删除
└── 定期清理
    └── 删除过期索引

10.2 业务数据 #

text
业务数据删除策略
├── 软删除
│   └── 标记删除字段
├── 定期清理
│   └── 清理过期软删除数据
└── 归档备份
    └── 删除前备份

十一、ILM删除策略 #

11.1 创建ILM策略 #

bash
PUT /_ilm/policy/logs_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_size": "50gb",
            "max_age": "1d"
          }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          },
          "shrink": {
            "number_of_shards": 1
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "freeze": {}
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

11.2 应用ILM策略 #

bash
PUT /_index_template/logs_template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "lifecycle.name": "logs_policy",
      "lifecycle.rollover_alias": "logs"
    }
  }
}

十二、最佳实践 #

12.1 删除前检查 #

bash
GET /products/_search
{
  "query": {
    "term": {
      "status": "deleted"
    }
  },
  "size": 0
}

12.2 删除操作建议 #

text
删除建议
├── 小批量删除
│   └── 使用Bulk API
├── 大批量删除
│   └── 使用Delete By Query
├── 定期删除
│   └── 使用ILM
├── 重要数据
│   └── 先备份后删除
└── 生产环境
    └── 使用软删除

12.3 删除后维护 #

text
删除后维护
├── 执行force merge
│   └── 清理已删除文档
├── 检查索引健康
│   └── 确保分片正常
└── 监控存储空间
    └── 确保空间充足

十三、总结 #

本章介绍了Elasticsearch文档删除:

  1. 单文档删除使用DELETE API
  2. 批量删除使用Bulk API或Delete By Query
  3. Delete By Query支持条件删除
  4. 软删除提供可恢复性
  5. ILM实现自动删除策略
  6. 删除后需要维护索引

下一步,我们将学习文档获取操作。

最后更新:2026-03-27