您的位置:

详解ES删除文档

在ES中,删除文档有多种方式和不同的注意点。本文将从以下几个方面对ES删除文档进行详细阐述:

一、根据ID删除文档

使用ES进行文档删除的一种简单方式是根据文档ID进行删除。每个文档在ES中都有唯一的ID,可以通过ID来进行文档的删除。

DELETE /{index}/{type}/{id}

其中,{index}表示索引名,{type}表示类型名,{id}表示要删除的文档ID。例如,要删除名为“test_index”中类型为“test_type”中id为“1”的文档:

DELETE /test_index/test_type/1

需要注意的是,如果尝试删除一个不存在的ID,Elasticsearch会返回一个404响应和错误信息。

二、根据查询删除文档

除了根据ID进行文档删除之外,还可以使用查询语句来删除符合条件的所有文档。

POST /{index}/{type}/_delete_by_query
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "测试"        }}, 
        { "match": { "content": "文档内容" }}
      ]
    }
  }
}

其中,{index}表示要删除文档的索引名,{type}表示要删除文档的类型。上述代码将会删除所有索引名为“test_index”中类型为“test_type”中符合查询条件的文档。

需要注意的是,如果查询语句太过复杂、文档数量庞大,Elasticsearch会消耗大量的资源和时间,建议非必要情况下谨慎使用。

三、使用Bulk API删除文档

有时候,需要批量删除文档,这时候可以使用ES提供的Bulk API。

POST /{index}/{type}/_bulk
{"delete":{"_id":"1"}}
{"delete":{"_id":"2"}}

上述代码将会删除索引名为“test_index”类型为“test_type”中ID为1和2的文档。

需要注意的是,Bulk API可以一次性处理多个删除操作。同时,ES的_delete_by_query接口会受到节省的IoC和内存资源的影响,因此,在面对批量删除需求时,使用Bulk API是一个更加可靠的选择。

四、删除自定义Routing的文档

在ES中,Routing是指由客户端指定的文档路由策略。基于这种策略,可以将相关的文档放在一起的shard内。

在删除某些shard内的文档时也需要使用Routing参数,如下所示:

DELETE /{index}/{type}/{id}?routing={routing}

其中,routing参数需要指定,以保证删除的文档确实在该routing参数所指定的shard内。

总结

本文介绍了ES删除文档的多种方式,包括根据ID删除文档、根据查询删除文档、使用Bulk API删除文档和删除自定义Routing的文档。通过本文的讲解,读者可以清晰地了解ES中删除文档的操作方法和注意事项。