Compartir a través de

教程:在 Azure AI 搜索中为加密的 blob 进行索引编制和扩充,以进行全文搜索

本文介绍了如何使用 Azure AI 搜索为之前已使用客户管理的密钥在 Azure Blob 存储中加密的文档编制索引。

通常,索引器无法从使用 Azure Blob 存储客户端库的客户端加密功能加密的 blob 中提取内容,因为索引器无权访问 Azure Key Vault 客户管理的加密密钥。 但是,通过利用 DecryptBlobFile 自定义技能(然后是文档提取技能),你可以提供对该密钥的受控访问,以对文件进行解密,并从这些文件中提取内容。 这样就可以在不损害已存储文档的加密状态的情况下解锁为这些文档编制索引并对其进行扩充的功能。

本教程从以前加密的整个文档(非结构化文本,例如 Azure Blob 存储中的 PDF、HTML、DOCX 和 PPTX)着手,使用 REST 客户端和搜索 REST API 执行以下任务:

  • 定义一个管道,用于解密文档并从中提取文本。
  • 定义用于存储输出的索引。
  • 执行该管道以创建并加载索引。
  • 使用全文搜索和丰富的查询语法浏览结果。

如果没有 Azure 订阅,请在开始前创建一个试用版订阅

先决条件

自定义技能部署将创建一个 Azure 函数应用和一个 Azure 存储帐户。 由于这些资源是为你创建的,因此它们未作为先决条件列出。 完成本教程后,请记住清理资源,这样就不会为未使用的服务付费。

注意

技能组通常需要附加 Azure AI 多服务资源。 如前所述,此技能组不依赖 Azure AI 服务,因此不需要任何密钥。 如果以后添加了调用内置技能的扩充,请记得相应地更新技能组。

1 - 创建服务并收集凭据

部署自定义技能

此示例使用 Azure 搜索强大技能 GitHub 存储库中的示例 DecryptBlobFile 项目。 在本部分,你将技能部署到 Azure 函数,以便在技能组中使用。 一个内置的部署脚本会创建一个名称以 psdbf-function-app- 开头的 Azure 函数资源,并加载该技能。 系统会提示你提供订阅和资源组。 请确保选择你的 Azure Key Vault 实例所在的订阅。

在操作方面,DecryptBlobFile 技能采用每个 blob 的 URL 和 SAS 令牌作为输入,并使用 Azure AI 搜索需要的文件引用约定输出下载的解密文件。 请记住,DecryptBlobFile 需要使用加密密钥来执行解密操作。 在设置过程中,还将创建一个访问策略,用于授予DecryptBlobFile 函数对 Azure Key Vault 中的加密密钥的访问权限。

  1. 单击 DecryptBlobFile 登陆页上的“部署到 Azure”按钮,这将在 Azure 门户中打开所提供的资源管理器模板。

  2. 选择与 Azure Key Vault 实例所在订阅相同的订阅(如果选择不同的订阅,此教程将不起作用)。

  3. 选择现有资源组,或创建一个新组。 专用的资源组会让稍后的清理工作更容易。

  4. 选择“查看 + 创建”,确保同意条款,然后选择“创建”来部署 Azure 函数。

    Azure 门户中 ARM 模板页的屏幕截图。

  5. 等待部署完成。

你应具备一个 Azure 函数应用,其中包含解密逻辑和用于存储应用程序数据的 Azure 存储资源。 在接下来的几个步骤中,你将为应用授予访问密钥保管库的权限,并收集需要用于 REST 调用的信息。

在 Azure Key Vault 中授予权限

  1. 在门户中导航到你的 Azure Key Vault 服务。 在 Azure Key Vault 中创建访问策略,以授予对自定义技能的密钥访问权限。

  2. 在左侧导航窗格中,选择“访问策略”,然后选择“+ 创建”以启动“创建访问策略”向导。

    左侧导航窗格中“访问策略”命令的屏幕截图。

  3. 在“权限”页上的“从模板配置”下,选择“Azure Data Lake Storage”或“Azure 存储”。

  4. 选择“下一步”。

  5. 在“主体”页上,选择你已部署的 Azure 函数实例。 你可以使用在步骤 2 中用来创建它的资源前缀(默认前缀值为 psdbf-function-app)来搜索它。

  6. 选择“下一步”。

  7. 在“查看 + 创建”上,选择“创建”。

收集应用信息

  1. 在门户中导航到“psdbf-function-app”函数,记下需要用于 REST 调用的以下属性:

  2. 获取 函数 URL(可在函数主页面上的“概要”下找到)。

    Azure 函数应用的概述页面和“概要”部分的屏幕截图。

  3. 获取主机密钥代码(可以通过以下方式找到:导航到“应用密钥”,单击以显示默认密钥,然后复制该值。)

    Azure 函数应用的“应用密钥”页的屏幕截图。

  1. 登录到 Azure 门户,在搜索服务的概述页面中获取搜索服务的名称。 可以通过查看终结点 URL 来确认服务名称。 如果终结点 URL 为 https://mydemo.search.azure.cn,则服务名称为 mydemo

  2. 在“设置”>“密钥”中,获取有关该服务的完全权限的管理员密钥 。 有两个可交换的管理员密钥,为保证业务连续性而提供,以防需要滚动一个密钥。 可以在请求中使用主要或辅助密钥来添加、修改和删除对象。

    获取服务名称以及管理密钥和查询密钥

所有请求要求在发送到服务的每个请求的标头中指定 API 密钥。 具有有效的密钥可以在发送请求的应用程序与处理请求的服务之间建立信任关系,这种信任关系以每个请求为基础。

设置 REST 客户端

创建终结点和密钥的变量:

变量 从何处获取
admin-key 在 Azure AI 搜索服务的“密钥”页上。
search-service-name Azure AI 搜索服务的名称。 该 URL 为 https://{{search-service-name}}.search.azure.cn
storage-connection-string 在存储帐户中的“访问密钥”选项卡上,选择“密钥 1”>“连接字符串”。
storage-container-name 包含要编制索引的加密文件的 blob 容器的名称。
function-uri 在主页面上“概要”下的 Azure 函数中。
function-code 在 Azure 函数中,获取方法是:导航到“应用密钥”,单击以显示默认密钥,然后复制值。
api-version 保留为“2020-06-30”。
datasource-name 保留为“encrypted-blobs-ds”。
index-name 保留为“encrypted-blobs-idx”。
skillset-name 保留为“encrypted-blobs-ss”。
indexer-name 保留为“encrypted-blobs-ixr”。

查看并运行每个请求

使用 HTTP 请求创建扩充管道的对象:

  • 用于创建索引的 PUT 请求:此索引保存 Azure AI 搜索使用并返回的数据。

  • 用于创建数据源的 POST 请求:此数据源指定了与包含已加密 blob 文件的存储帐户的连接。

  • 创建技能集的 PUT 请求:技能组为将解密 blob 文件数据的 Azure 函数指定自定义技能定义,并指定 DocumentExtractionSkill 以在解密每个文档后从其中提取文本。

  • 用于创建索引器的 PUT 请求:运行索引器可检索 blob、应用技能组并存储结果。 必须在最后运行此请求。 技能组中的自定义技能会调用解密逻辑。

监视索引

提交“创建索引器”请求后,索引编制和扩充立即开始。 编制索引可能需要一段时间,具体取决于存储帐户中的文档数量。 要了解索引器是否仍在运行,请发送“获取索引器状态”请求并查看响应,以了解索引器是否正在运行,或查看错误和警告信息

如果使用的是免费层,应会收到以下消息:"Could not extract content or metadata from your document. Truncated extracted text to '32768' characters"。 出现此消息的原因是,免费层上的 Blob 索引编制存在 32K 字符提取限制。 在更高的层上,此数据集不会出现此消息。

搜索内容

索引器执行完成后,可以运行一些查询来验证是否已将数据成功解密并编制索引。 在门户中导航到你的 Azure AI 搜索服务,并使用搜索资源管理器对已编制索引的数据运行查询。

清理资源

在自己的订阅中操作时,最好在项目结束时删除不再需要的资源。 持续运行资源可能会产生费用。 可以逐个删除资源,也可以删除资源组以删除整个资源集。

可以使用左侧导航窗格中的“所有资源”或“资源组”链接 ,在门户中查找和管理资源。

后续步骤

成功地为加密的文件编制索引后,即可通过添加更多认知技能来循环访问此管道。 这将允许你扩充数据并获得对数据的更多见解。

如果你处理双重加密的数据,则可能需要研究 Azure AI 搜索中提供的索引加密功能。 尽管索引器需要使用解密的数据进行索引编制,但是索引一旦存在,就可以使用客户管理的密钥在搜索索引中对其进行加密。 这将确保数据在静止时始终加密。 有关详细信息,请参阅在 Azure AI 搜索中为数据加密配置客户管理的密钥