你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

运行或重置索引器、技能或文档

可通过三种方式调用索引器:按需调用、按计划调用或在创建索引器时调用(假设在“禁用”模式未创建)。 本文介绍如何在有和没有重置的情况下按需运行索引器。

重置索引器

在初次运行后,索引器将通过内部的“高水位线”跟踪已编制索引的搜索文档。 该标记永远不会公开,但索引器自身知道其上次停止的位置,以便在下次运行时从停止的位置重新开始。

如果需要重新生成全部或部分索引,可以通过重置清除索引器的高使用标记。 重置 API 可以在对象层次结构中按递减级别提供:

重置后,使用 Run 命令重新处理新文档和现有文档。 无法通过重置/运行删除在数据源中没有对应项的孤立搜索文档。 如果需要删除文档,请参阅添加、更新或删除文档

索引器执行

索引不在后台运行。 相反,搜索服务会根据正在进行的查询和对象管理操作(例如创建或更新索引)来平衡所有索引作业。 运行索引器时,如果索引量很大,应该会出现一定的查询延迟

你可以一次运行多个索引器,但每个索引器本身就是单个实例。 在索引器已在执行时启动新实例会生成以下错误:"Failed to run indexer "<indexer name>" error: "Another indexer invocation is currently in progress; concurrent invocations are not allowed."

索引器限制因工作负荷而异。 对于每个工作负荷,适用以下作业限制。

工作负荷 最大持续时间 最大作业数 执行环境 1
基于文本的索引 24 小时 每个搜索单位 1 个 2 通常在搜索服务上运行。
基于技能的索引 2 小时 不确定 通常在内部托管的多租户内容处理群集上运行,具体取决于技能组的复杂程度。 如果搜索服务有容量,简单的技能可能会在搜索服务上执行。 否则,基于技能的索引器作业将在非服务状态下执行。 因为内容处理群集是多租户群集,所以会添加节点以满足需求。 如果在按需或计划执行中遇到延迟,可能是因为系统正在添加节点或等待节点变为可用。

1 为了获得最佳处理能力,搜索服务将确定索引器操作的内部执行环境。 你无法控制或配置该环境,但根据任务的数量和复杂性,搜索服务将自行运行作业,或将计算密集型任务卸载到内部托管群集,从而为日常操作留出更多特定于服务的资源。 用于执行计算密集型任务的多租户环境由 Microsoft 管理和保护,客户无需支付额外费用。

2 搜索单位可以是分区和副本的灵活组合,最大索引器作业数不依赖于其中任何一个。 换言之,如果有四个单元,则可以同时运行四个基于文本的索引器作业,无论搜索单元的部署方式如何。

提示

如果正在对大型数据集编制索引,则可通过按计划放置索引器来扩大处理量。 有关所有索引器相关限制的完整列表,请参阅索引器限制

无需重置即可运行

运行索引器将仅检测和处理将搜索索引与基础数据源中的更改同步所需的内容。 增量索引首先定位内部高使用标记,找到上次更新的搜索文档,该文档将成为索引器对数据源中的新文档和更新文档执行索引的起点。

更改检测对于确定数据源中的新增内容或更新内容至关重要。 如果内容不变,则运行无效。 Blob 存储通过其 LastModified 属性提供内置更改检测。 必须先为其他数据源(如 Azure SQL 或 Cosmos DB)配置更改检测,然后索引器才能读取新行和更新行。

如何重置并运行索引器

重置会清除高使用标记。 搜索索引中的所有文档都会标记为完全覆盖,而不会内联更新或合并到现有内容中。 对于具有技能组和扩充缓存的索引器,重置索引还会隐式重置技能组。

重置后执行 Run 命令时,会发生以下实际操作:

  • 将在基础源中找到的所有新文档添加到搜索索引中。
  • 在搜索索引中覆盖同时存在于数据源和搜索索引的所有文档。
  • 重新生成通过技能组创建的任何扩充内容。 刷新扩充缓存(如果已启用)。

如前所述,重置是一种被动操作:必须接着发出 Run 请求才能重新生成索引。

如果重置显式或隐式包含技能,则重置/运行操作适用于搜索索引或知识库、特定文档或投影以及缓存的扩充项。

重置也适用于新建和更新操作。 它不会对搜索索引中的孤立文档触发删除或清理。 有关删除文档的详细信息,请参阅添加、更新或删除文档

重置索引器后,无法撤消该操作。

  1. 登录到 Azure 门户,然后打开搜索服务页面。

  2. 在“概述”页上,选择“索引”选项卡。

  3. 选择索引器。

  4. 选择“重置”命令,然后选择“是”确认该操作。

  5. 刷新页面以显示状态。 你可以选择该项以查看其详细信息。

  6. 选择“运行”开始索引器处理,或等待下一个计划的执行。

    Screenshot of indexer execution portal page, with Reset command highlighted.

如何重置技能(预览)

对于具有技能组的索引器,可以重置单项技能以强制处理该技能以及依赖其输出的任何下游技能。 扩充缓存(如果已启用)也会刷新。

重置技能目前仅适用于 REST,可通过 api-version=2020-06-30-Preview 或更高版本获得。

POST /skillsets/[skillset name]/resetskills?api-version=2020-06-30-Preview
{
    "skillNames" : [
        "#1",
        "#5",
        "#6"
    ]
}

可按以上示例中所示指定单个技能,但如果其中任一技能需要未列出的技能(#2 到 #4)的输出,则除非缓存可以提供必要的信息,否则未列出的技能将会运行。 若要做到这一点,技能 #2 到 #4 的已缓存扩充不得依赖于 #1(列为要重置的技能)。

如果未指定任何技能,则执行整个技能组;如果已启用缓存,则还会刷新缓存。

记住接着使用“运行索引器”来调用实际处理。

如何重置文档(预览版)

重置文档 API 接受文档键列表,以便你可以刷新特定文档。 如果已指定重置参数,这些参数将成为要处理哪些内容的唯一决定因素,而不管基础数据发生了其他哪些更改。 例如,如果自上次索引器运行以来添加或更新了 20 个 Blob,但你只重置了一个文档,则只会处理这一个文档。

对于每个文档,将使用数据源中的值刷新该搜索文档中的所有字段。 无法挑选要刷新的字段。

如果文档已通过技能组扩充并包含缓存的数据,则只会对指定的文档调用该技能组,并为已重新处理的文档更新缓存。

首次测试此 API 时,以下 API 可帮助你验证并测试行为:

  1. 调用 API 版本为 api-version=2020-06-30-Preview 或更高版本的获取索引器状态,以检查重置状态和执行状态。 可以在状态响应的末尾找到有关重置请求的信息。

  2. 调用 API 版本为 api-version=2020-06-30-Preview 或更高版本的重置文档,以指定要处理的文档。

    POST https://[service name].search.windows.net/indexers/[indexer name]/resetdocs?api-version=2020-06-30-Preview
    {
        "documentKeys" : [
            "1001",
            "4452"
        ]
    }
    
    • 请求中提供的文档键是搜索索引中的值,这些值可能不同于数据源中的相应字段。 如果你不确定键值,请发送查询以返回该值。可以使用 select 以便仅返回文档键字段。

    • 对于分析为多个搜索文档的 blob(例如 parsingMode 设置为 jsonLines 或 jsonArraysdelimitedText),则文档键是由索引器生成的,你可能不知道该键。 在此情况下,查询文档键以返回正确的值。

  3. 调用运行索引器(任何 API 版本)来处理指定文档。 仅为这些特定文档编制索引。

  4. 再次调用运行索引器以从上一个高使用标记开始处理。

  5. 调用搜索文档,以检查更新的值并在不确定该值的情况下返回文档键。 如果你要限制在响应中显示的字段,请使用 "select": "<field names>"

覆盖文档键列表

结合不同的键多次调用重置文档 API 会将新键追加到文档键重置列表。 如果调用 API 并将 overwrite 参数设置为 true,则会用新的列表覆盖当前列表:

POST https://[service name].search.windows.net/indexers/[indexer name]/resetdocs?api-version=2020-06-30-Preview
{
    "documentKeys" : [
        "200",
        "630"
    ],
    "overwrite": true
}

检查重置状态“currentState”

若要检查重置状态并查看哪些文档键已排队等待处理,请执行以下步骤。

  1. 调用版本为 api-version=06-30-2020-Preview 或更高版本的获取索引器状态

    预览版 API 将返回 currentState 部分,该部分位于响应的末尾。

    "currentState": {
        "mode": "indexingResetDocs",
        "allDocsInitialTrackingState": "{\"LastFullEnumerationStartTime\":\"2021-02-06T19:02:07.0323764+00:00\",\"LastAttemptedEnumerationStartTime\":\"2021-02-06T19:02:07.0323764+00:00\",\"NameHighWaterMark\":null}",
        "allDocsFinalTrackingState": "{\"LastFullEnumerationStartTime\":\"2021-02-06T19:02:07.0323764+00:00\",\"LastAttemptedEnumerationStartTime\":\"2021-02-06T19:02:07.0323764+00:00\",\"NameHighWaterMark\":null}",
        "resetDocsInitialTrackingState": null,
        "resetDocsFinalTrackingState": null,
        "resetDocumentKeys": [
            "200",
            "630"
        ]
    }
    
  2. 查看“模式”:

    对于“重置技能”,“模式”应设置为 indexingAllDocs(因为通过 AI 扩充填充的字段所在的所有文档都可能会受影响)。

    对于“重置文档”,“模式”应设置为 indexingResetDocs。 索引器会将此状态保持到已处理重置文档调用中提供的所有文档键,在这段时间,在该操作正在进行时不会执行任何其他索引器作业。 在文档键列表中查找所有文档需要破解每个文档,以查找键并根据该键进行匹配,如果数据集较大,这可能需要一段时间。 如果 Blob 容器包含数百个 Blob,而你想要重置的文档放在最后,则索引器只有在事先检查了所有其他 Blob 之后,才能找到匹配的 Blob。

  3. 重新处理文档后,再次运行“获取索引器状态”。 索引器将恢复 indexingAllDocs 模式,并且在下次运行时,将处理任何新文档或已更新的文档。

后续步骤

重置 API 用于告知下次索引器运行的范围。 在实际处理中,你需要调用按需索引器运行,或者允许计划的作业完成工作。 运行完成后,索引器将恢复正常处理,不管是按计划的处理还是按需处理。

重置并重新运行索引器作业后,可以从搜索服务监视状态,或者通过诊断日志记录获取详细信息。