删除 API

编辑

从指定的索引中删除 JSON 文档。

请求

编辑

DELETE /<index>/_doc/<_id>

先决条件

编辑
  • 如果启用了 Elasticsearch 安全功能,您必须拥有目标索引或索引别名的 deletewrite 索引权限

描述

编辑

您可以使用 DELETE 从索引中删除文档。您必须指定索引名称和文档 ID。

您不能直接向数据流发送删除请求。要删除数据流中的文档,您必须以包含该文档的后备索引为目标。请参阅 更新或删除后备索引中的文档

乐观并发控制
编辑

可以使删除操作具有条件性,并且只有当文档的最后一次修改被分配了由 if_seq_noif_primary_term 参数指定的序列号和主项时才执行。如果检测到不匹配,操作将导致 VersionConflictException 和 409 状态代码。有关详细信息,请参阅 乐观并发控制

版本控制
编辑

每个索引的文档都有版本号。删除文档时,可以指定 version 来确保我们要删除的相关文档实际上正在被删除,并且在此期间没有发生更改。对文档执行的每次写入操作(包括删除)都会使其版本递增。删除文档的版本号在删除后会短时间可用,以允许控制并发操作。删除文档的版本保持可用的时间长度由 index.gc_deletes 索引设置确定,默认值为 60 秒。

路由
编辑

如果在索引编制期间使用了路由,则还需要指定路由值才能删除文档。

如果 _routing 映射设置为 required 并且没有指定路由值,则删除 API 将抛出 RoutingMissingException 并拒绝请求。

例如

resp = client.delete(
    index="my-index-000001",
    id="1",
    routing="shard-1",
)
print(resp)
response = client.delete(
  index: 'my-index-000001',
  id: 1,
  routing: 'shard-1'
)
puts response
const response = await client.delete({
  index: "my-index-000001",
  id: 1,
  routing: "shard-1",
});
console.log(response);
DELETE /my-index-000001/_doc/1?routing=shard-1

此请求删除 id 为 1 的文档,但它会根据用户进行路由。如果没有指定正确的路由,则不会删除该文档。

自动创建索引
编辑

如果使用 外部版本控制变体,则如果指定的索引不存在,则删除操作会自动创建该索引。有关手动创建索引的信息,请参阅 创建索引 API

分布式
编辑

删除操作被哈希到特定的分片 id 中。然后,它被重定向到该 id 组中的主分片,并(如果需要)复制到该 id 组中的分片副本。

等待活动分片
编辑

发出删除请求时,您可以设置 wait_for_active_shards 参数,以要求最少数量的分片副本处于活动状态,然后再开始处理删除请求。有关详细信息和用法示例,请参阅此处

刷新
编辑

控制此请求所做的更改何时对搜索可见。请参阅 ?refresh

超时
编辑

当执行删除操作时,分配给执行删除操作的主分片可能不可用。发生这种情况的一些原因可能是主分片当前正在从存储中恢复或正在进行重新定位。默认情况下,删除操作将等待主分片最多 1 分钟变为可用状态,然后失败并响应错误。timeout 参数可用于显式指定等待时间。以下是一个将其设置为 5 分钟的示例

resp = client.delete(
    index="my-index-000001",
    id="1",
    timeout="5m",
)
print(resp)
response = client.delete(
  index: 'my-index-000001',
  id: 1,
  timeout: '5m'
)
puts response
const response = await client.delete({
  index: "my-index-000001",
  id: 1,
  timeout: "5m",
});
console.log(response);
DELETE /my-index-000001/_doc/1?timeout=5m

路径参数

编辑
<index>
(必需,字符串)目标索引的名称。
<_id>
(必需,字符串)文档的唯一标识符。

查询参数

编辑
if_seq_no
(可选,整数)仅当文档具有此序列号时才执行操作。请参阅 乐观并发控制
if_primary_term
(可选,整数)仅当文档具有此主项时才执行操作。请参阅 乐观并发控制
refresh
(可选,枚举)如果 true,则 Elasticsearch 会刷新受影响的分片,使此操作对搜索可见;如果 wait_for,则等待刷新以使此操作对搜索可见;如果 false,则不对刷新执行任何操作。有效值:truefalsewait_for。默认值:false
routing
(可选,字符串)用于将操作路由到特定分片的自定义值。
timeout
(可选,时间单位等待活动分片的时间段。默认为 1m(一分钟)。
version
(可选,整数)用于并发控制的显式版本号。指定的版本必须与文档的当前版本匹配,请求才能成功。
version_type
(可选,枚举)特定的版本类型:externalexternal_gte
wait_for_active_shards

(可选,字符串)在继续操作之前必须处于活动状态的每个分片的副本数。设置为 all 或任何非负整数,最高可达索引中每个分片的副本总数(number_of_replicas+1)。默认为 1,这意味着仅等待每个主分片处于活动状态。

请参阅 活动分片

示例

编辑

my-index-000001 索引中删除 JSON 文档 1

resp = client.delete(
    index="my-index-000001",
    id="1",
)
print(resp)
response = client.delete(
  index: 'my-index-000001',
  id: 1
)
puts response
const response = await client.delete({
  index: "my-index-000001",
  id: 1,
});
console.log(response);
DELETE /my-index-000001/_doc/1

API 返回以下结果

{
  "_shards": {
    "total": 2,
    "failed": 0,
    "successful": 2
  },
  "_index": "my-index-000001",
  "_id": "1",
  "_version": 2,
  "_primary_term": 1,
  "_seq_no": 5,
  "result": "deleted"
}