Compartir a través de

删除搜索索引中的文档

本文介绍如何使用 REST API 或 Azure SDK 从 Azure AI 搜索的搜索索引中删除整个文档。 它涵盖以下任务:

  • 了解何时需要手动删除
  • 标识要删除的特定文档
  • 获取文档计数和存储指标
  • 删除单个文档或孤立文档
  • 批量删除文档
  • 确认删除

小窍门

对于快速单文档删除,请跳到 “删除单个文档”。

先决条件

了解何时需要手动删除

使用 推送模式方法编制索引时,需要手动删除文档,应用程序代码处理数据导入和驱动索引。

如果搜索文档与源文档不再关联,则在索引器驱动的工作负载中可能还需要手动删除文档。 索引器的重要好处是通过目标数据源的更改和删除检测功能自动检索和同步内容。 所有受支持的数据源都提供某种级别的检测。 但在某些情况下,同步删除以软删除策略为谓词,在该策略中标记源文档(或记录)以供删除,运行索引器以删除索引内容,只有在更新索引后,才能以物理方式删除源内容。 如果首先删除源内容,则搜索索引中有 无关联文档 。 必须手动删除索引中的孤立文档,才能在源和索引内容之间重新建立一致性。

以下链接提供有关索引器驱动工作负荷中每个数据源的更改和删除检测的详细信息。

标识要删除的特定文档

所有文档均由搜索索引中的 文档键 唯一标识。 若要删除文档,必须标识哪个字段是文档密钥,并在删除请求上提供密钥。

在 Azure 门户中,可查看每个索引的字段。 文档键是字符串字段,并使用键图标表示,便于更容易识别。

查找文档密钥

知道哪个字段是文档键后,可以通过运行返回搜索结果中的键字段的查询来获取键值。

在此示例中,搜索字符串用于在索引中查找文档,select 语句确定结果中的字段。 “HotelId”是此示例中的文档密钥。

POST https://[service name].search.azure.cn/indexes/hotels-sample-index/docs/search?api-version=2025-09-01
{
    "search": "this query has terms that pertain to the document I want to delete",
    "select": "HotelName, HotelId",
    "count": true
}

默认情况下,此关键字搜索的结果是前 50 个。 如果要删除的文档满足搜索条件,则应在结果中看到该文档(以及它的关键)。 确保查询包含一个描述性字段,可帮助你确认文档正确。

{
  "@odata.count": 50,
  "value": [
    {
      "@search.score": 4.5116634,
      "HotelId": "18",
      "HotelName": "Ocean Water Resort & Spa"
    }
   ...
  ]
}

简单字符串非常简单,但是如果索引使用 base-64 编码的字段,或者搜索文档是从 parsingMode 设置生成的,则你可能正在使用不熟悉的值。 如果你正在处理由索引器创建的分块文档,文档键通常是一个生成的“chunked_id”,由一长串数字和字母组成。

查找特定文档

有了文档键后,请运行检索整个文档的 查找查询 。 如果文档是区块,应会看到父文档的 ID。 文档密钥作为查询参数包含在内。

第一个示例返回具有文档键值 18的酒店。

GET https://[service name].search.azure.cn/indexes/hotels-sample-index/docs('18')&api-version=2025-09-01

第二个示例返回区块文档。 “chunk_id”是文档密钥。

GET https://[service name].search.azure.cn/indexes/chunking-example-index/docs('aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb')&api-version=2025-09-01

第二个示例中的响应包括所有字段,应查看这些字段以确保知道要删除的内容。 如果需要将单个父文档手动索引到搜索索引中的分块文档,则包含父信息的字段非常有用。

{
  "chunk_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
  "parent_id": "bbbbbbbb-1111-2222-3333-cccccccccccc",
  "chunk": "Unpopulated Slopes of an Active Volcano\u2014Naples, Italy ... 90\n\nDazzling Coastlines\u2014Italy ... .92\n\nLiving on Fertile Land\u2014Nile River, Egypt  ... 94\n\n\n\n vii",
  "title": "earth_at_night_508.pdf",
  "text_vector": [ <omitted> ]
}

小窍门

使用 REST 客户端、Azure SDK 客户端库或 命令行工具 运行查找查询。 Azure 门户不支持对查询的 GET 请求。

获取文档计数和存储指标

在删除文档之前,请获取索引文档计数和存储的初始指标,以便稍后可以确认删除。

可以使用以下方法获取文档计数和索引存储:

下面是示例响应:

{
  "documentCount": 12,
  "storageSize": 123456,
  "vectorIndexSize": 123456
}

删除单个文档

  1. 使用 文档 - 索引 REST API 进行删除 @search.action ,以将其从搜索索引中删除。

  2. 创建一个指定索引名称和docs/index终结点的POST调用。

  3. 请确保请求正文包含要删除的文档的密钥。

    POST https://[service name].search.azure.cn/indexes/hotels-sample-index/docs/index?api-version=2025-09-01
    Content-Type: application/json   
    api-key: [admin key]
    
    {  
      "value": [  
        {  
          "@search.action": "delete",  
          "id": "18"  
        }  
      ]  
    }
    
  4. 发送请求。

    下表说明了可在响应中返回的各种每文档 状态代码 。 某些状态代码会指示请求本身的问题,而另一些代码会指示临时错误条件。 对于后者,应在延迟后重试。

    状态代码 Meaning 可重试 注释
    200 已成功删除文档。 n/a 删除操作是幂等的。 也就是说,即使索引中不存在某个文档键,使用该键尝试执行删除操作也会生成 200 状态代码。
    400 文档中有一个错误,阻止删除它。 响应中的错误消息提供了详细信息。
    422 索引暂时不可用,因为在将“allowIndexDowntime”标志设置为“true”的情况下更新了它。 是的 等待索引可用。
    503 搜索服务暂时不可用,可能是因为负荷较重。 是的 在此情况下,代码应在重试前等待,否则面临延长服务不可用性状态的风险。

    注释

    如果客户端代码经常遇到 207 响应,则一个可能的原因是系统过载。 可以通过检查 statusCode 503 的属性来确认这一点。 如果是这样,我们建议限制索引请求。 否则,如果索引流量不下降,系统可能开始使用 503 错误拒绝所有请求。

  5. 可以重新发送 查找查询 以确认删除。 你应该收到一个 404 未找到文档的提示。

    GET https://[service name].search.azure.cn/indexes/hotel-sample-index/docs/18?api-version=2025-09-01
    

参考:文档 - 索引

成功的删除请求返回 HTTP 200(确定)。 响应正文包含每个文档的状态:

{
    "value": [
        { "key": "18", "status": true, "statusCode": 200 }
    ]
}

批量删除文档

  1. 使用 文档 - 索引 REST API 进行删除 @search.action ,以将其从搜索索引中删除。 创建一个指定索引名称和docs/index终结点的POST调用。

  2. 请确保请求正文包含您要删除的所有文档的键值。

    POST https://[service name].search.azure.cn/indexes/hotels-sample-index/docs/index?api-version=2025-09-01
    Content-Type: application/json   
    api-key: [admin key]
    
    {
      "value": [
        {
          "@search.action": "delete",
          "id": "doc1"
        },
        {
          "@search.action": "delete",
          "id": "doc2"
        }
      ]
    }
    
  • 批处理限制:建议将批限制为 1,000 个文档,或每个请求大约 16 MB,以确保最佳性能。

  • 幂等性:删除操作是幂等的;如果尝试删除不存在的文档ID,API仍将返回200 OK状态。

  • 延迟:文档并不总是从存储中立即删除。 后台进程每隔几分钟执行物理删除。

  • 矢量存储:删除文档不会立即释放矢量存储配额。 物理删除需要几分钟时间。 如果想要立即回收矢量空间,可能需要删除并重建索引。

参考:文档 - 索引

验证文档删除

删除文档后,请验证删除是否成功。

  1. 在 Azure 门户中,打开搜索服务 “概述 ”页。
  2. 选择搜索管理>索引
  3. 检查索引的文档计数列。
  4. 等待几分钟后刷新页面,如果计数未更改(因为删除是异步进行的)。

删除文档不会立即释放索引中的空间。 每隔几分钟,后台进程就会执行物理删除。 无论是使用 Azure 门户还是“获取统计信息 API”来返回索引统计信息,都可能会有一些延迟,然后才会在 Azure 门户和 API 指标中反映出删除的结果。

排查文档删除问题

下表列出了删除文档以及如何解决这些问题的常见问题。

問题 原因 决议
文档计数不变 删除是异步的。 后台进程每隔几分钟运行一次。 等待 2-3 分钟并刷新。 再次检查索引统计信息。
400 错误的请求 无效的文档键或格式不正确的请求正文。 验证文档密钥字段名称是否与索引架构匹配。 检查 JSON 语法。
403 禁止访问 权限不足。 使用管理员 API 密钥,或者确保你的身份具有搜索索引数据贡献者角色。
索引上找不到 404 索引名称不正确或不存在。 验证请求 URL 中的索引名称。
存储未回收 在后台异步执行物理删除。 等待几分钟。 对于即时矢量存储回收,请删除并重新生成索引。
未关联的文档仍被保留 在索引器运行并检测删除之前,源文档已被删除。 使用文档标识符手动删除孤立的文档。

另请参阅