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文档删除:
- 单文档删除使用DELETE API
- 批量删除使用Bulk API或Delete By Query
- Delete By Query支持条件删除
- 软删除提供可恢复性
- ILM实现自动删除策略
- 删除后需要维护索引
下一步,我们将学习文档获取操作。
最后更新:2026-03-27