Elasticsearch 实战:Elasticsearch 文档删除
在 Elasticsearch 中,删除文档是一个相对直接的过程,通过发送一个 DELETE
请求到文档的唯一标识(_index
、_type
、_id
)即可完成。以下是如何删除文档的详细步骤:
**1. 确定待删除文档的唯一标识
在删除文档之前,需要知道要删除的文档的唯一标识。这个标识由三部分组成:索引名 (_index
)、类型名 (_type
) 和文档 ID (_id
)。例如,要删除索引 my_index
中类型为 _doc
、ID 为 1
的文档,其唯一标识为:
my_index/_doc/1
**2. 发送 DELETE 请求
使用 DELETE
HTTP 方法,向 Elasticsearch 发送请求,目标 URL 为文档的唯一标识:
DELETE /my_index/_doc/1
**3. 响应与确认
如果文档存在且删除成功,Elasticsearch 将返回一个 HTTP 200 状态码,响应体类似于:
{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": .png",
"_primary_term": 2
}
其中,result
字段显示操作结果为 "deleted"
,表明文档已被成功删除。
如果文档不存在或者由于权限等问题无法删除,Elasticsearch 将返回非 200 的 HTTP 状态码以及相应的错误信息。
**4. 批量删除文档
对于需要删除大量文档的场景,可以使用 delete_by_query
API 执行批量删除。该 API 允许您基于查询条件删除符合条件的所有文档。以下是一个示例:
POST /my_index/_delete_by_query
{
"query": {
"match": {
"author": "John Doe"
}
}
}
在这个例子中,所有 author
字段为 “John Doe” 的文档都将被删除。请注意,批量删除操作可能对集群性能产生较大影响,尤其是在大型索引中,因此在执行此类操作时应谨慎评估其对系统的影响,并可能需要在低峰时段进行。
**5. 乐观锁定(Optimistic Concurrency Control)
如同文档修改,删除文档时也可以利用乐观锁定(Optimistic Concurrency Control,OCC)机制防止并发删除导致的问题。通过指定 if_primary_term
和 if_sequence_number
参数(或仅使用 _version
参数),可以在删除文档时检查其版本是否与预期相符。如果不符,说明文档已被其他进程更新,删除操作将失败,从而避免意外删除已更新的文档。
DELETE /my_index/_doc/1?if_primary_term=1&if_sequence_number=123
总之,删除 Elasticsearch 中的文档只需向其唯一标识发送一个 DELETE
请求即可。对于批量删除或需要考虑并发控制的场景,可以使用 delete_by_query
API 或乐观锁定机制。在进行删除操作时,务必确保操作的正确性和对系统的影响可控。