在 Azure AI 搜索中创建索引器

在 Azure AI 搜索中使用索引器自动导入数据并编制索引。 索引器是搜索服务上的命名对象,它连接到外部 Azure 数据源、读取数据并将其传递给搜索引擎进行索引。 如果正在使用受支持的数据源,使用索引器可以显著减少需编写的代码量并降低代码的复杂度。

索引器支持两个工作流:

  • 基于文本的索引,从全文搜索方案的文本内容中提取字符串和元数据。

  • 基于技能的索引编制,使用内置或自定义技能添加集成机器学习来基于图像和大型无差别内容进行分析,并提取或推理文本和结构。 使用基于技能的索引编制可以搜索无法以其他方式轻松进行全文搜索的内容。 若要了解更多信息,请参阅 Azure AI 搜索中的 AI 扩充

本文重点介绍创建索引器的基本步骤。 根据具体的数据源和工作流,可能还需要进行更多的配置。

先决条件

  • 受支持的数据源,其中包含要引入的内容。

  • 索引器数据源,用于设置与外部数据的连接。

  • 可以接受传入数据的搜索索引

  • 不应超出服务层级的最大限制。 免费层允许每种类型具有三个对象,1-3 分钟的索引器处理时间,如果有一个技能组,处理时间为 3-10 分钟。

索引器模式

创建索引器时,索引器定义是以下两种模式之一:基于文本的索引或包含技能的 AI 扩充。 这些模式相同,但基于技能的索引具有更多的定义。

基于文本的索引编制的索引器示例

全文搜索的基于文本的索引是索引器的主要用例,对于此工作流,索引器如以下示例所示。

{
  "name": (required) String that uniquely identifies the indexer,
  "description": (optional),
  "dataSourceName": (required) String indicating which existing data source to use,
  "targetIndexName": (required) String indicating which existing index to use,
  "parameters": {
    "batchSize": null,
    "maxFailedItems": 0,
    "maxFailedItemsPerBatch": 0,
    "base64EncodeKeys": false,
    "configuration": {}
  },
  "fieldMappings": (optional) unless field discrepancies need resolution,
  "disabled": null,
  "schedule": null,
  "encryptionKey": null
}

索引器具有以下要求:

  • "name" 属性,用于唯一标识索引器集合中的索引器。
  • "dataSourceName" 属性,指向数据源对象。 它指定与外部数据的连接。
  • "targetIndexName" 属性,指向目标搜索索引。

其他参数是可选的,并可修改运行时行为,例如,在使整个作业失败之前可接受多少个错误。 所需参数在所有索引器中指定,并记录在REST API 引用中。

用于 blob、SQL 和 Azure Cosmos DB 的数据源特定索引器为特定于源的行为提供额外的 "configuration" 参数。 例如,如果源是 Blob 存储,就可以设置一个参数用于根据文件扩展名进行筛选:"parameters" : { "configuration" : { "indexedFileNameExtensions" : ".pdf,.docx" } }。 如果源是 Azure SQL,则你可以设置查询超时参数。

如果数据源中的字段与搜索索引中的字段之间存在名称或类型差异,则字段映射用于显式映射源到目标的字段。

默认情况下,在搜索服务中创建索引器时,该索引器将立即运行。 如果你不想要执行索引器,请在创建索引器时将 "disabled" 设置为 true。

还可指定计划或设置加密密钥,对索引器定义额外进行加密。

基于技能的索引编制的索引器示例

索引器还可驱动 AI 扩充。 以上所有属性和参数都适用,但以下额外属性特定于 AI 扩充:"skillSetName""cache""outputFieldMappings"

{
  "name": (required) String that uniquely identifies the indexer,
  "dataSourceName": (required) String, provides raw content that will be enriched,
  "targetIndexName": (required) String, name of an existing index,
  "skillsetName" : (required for AI enrichment) String, name of an existing skillset,
  "cache":  {
    "storageConnectionString" : (required if you enable the cache) Connection string to a blob container,
    "enableReprocessing": true
    },
  "parameters": { },
  "fieldMappings": (optional) Maps fields in the underlying data source to fields in an index,
  "outputFieldMappings" : (required) Maps skill outputs to fields in an index,
}

AI 扩充属于独立的主题领域,不在本文的讨论范围之内。 有关详细信息,请从以下文章入手:AI 扩充Azure AI 搜索中的技能组创建技能组映射扩充输出字段为 AI 扩充启用缓存

准备外部数据

索引器处理数据集。 运行索引器时,它将连接到数据源,从容器或文件夹中检索数据,可以选择将其序列化为 JSON,然后将其传递到搜索引擎以编制索引。 本节介绍基于文本的索引编制对传入数据的要求。

源数据 任务
JSON 文档 确保传入数据的结构或形状与搜索索引的架构相对应。 大多数索引相当平展,其中字段集合由同一级别的字段构成。 但是,可以通过复杂字段和集合实现分层结构或嵌套结构。
关系 你将它作为平展行集提供,其中每一行将成为索引中的完整或部分搜索文档。

若要将关系数据平展为行集,应创建一个 SQL 视图,或生成一个查询用于返回同一行中的父记录和子记录。 例如,内置酒店示例数据集是一个 SQL 数据库,拥有 50 条记录(每个酒店一条记录),这些记录关联相关表中的房间记录。 将统一数据平展为行集的查询在每条酒店记录中的 JSON 文档内嵌入所有客房信息。 嵌入的客房信息是使用 FOR JSON AUTO 子句的查询生成的。

可以在定义返回嵌入式 JSON 的查询中详细了解此方法。 这只是一个示例,还有一些方法具有相同的效果。
文件 索引器通常会为每个文件创建一个搜索文档,其中搜索文档包含内容和元数据的字段。 根据具体的文件类型,索引器有时可以将一个文件解析为多个搜索文档。 例如,在 CSV 文件中,每一行都可以成为单独的搜索文档。

请记住,只需拉取可搜索和可筛选的数据:

  • 可搜索的数据为文本。
  • 可筛选的数据为字母数字。

Azure AI 搜索无法搜索任何格式的二进制数据,但它可以提取并推断图像文件的文本说明(请参阅 AI 扩充)来创建可搜索的内容。 同样,可通过自然语言模型划分和分析大文本,以查找结构或相关信息,并生成可添加到搜索文档中的新内容。

如果索引器不能解决数据问题,则可能需要其他形式的数据清理或处理。 有关详细信息,请参阅 Azure 数据库产品的产品文档。

准备数据源

索引器需要可指定类型、容器和连接的数据源。

  1. 请确保使用的是受支持的数据源类型

  2. 创建一个数据源定义。 下面列出了一些更常用的数据源:

  3. 如果数据源是数据库(例如 Azure SQL 或 Cosmos DB),请启用更改跟踪。 Azure 存储通过每个 blob、文件和表上的LastModified属性进行内置更改跟踪。 各种数据源的上述链接解释了索引器支持哪些更改跟踪方法。

准备索引

索引器还需要搜索索引。 请回想一下,索引器将数据传递给搜索引擎来编制索引。 如同索引器包含用于确定执行行为的属性一样,索引架构包含对字符串索引编制方式(只会分析并标记化字符串)产生深刻影响的属性。

  1. 创建搜索索引开始。

  2. 设置字段集合与字段属性。

    只有字段才能接收外部内容。 根据字段在架构中的属性,会对每个字段的值进行分析、标记化,或将其存储为逐字字符串,以用于筛选器、模糊搜索和预先输入查询。

    当名称和类型相同时,索引器可以自动将源字段映射到目标索引字段。 如果无法隐式映射字段,请记住,可以定义显式字段映射,以告知索引器如何路由内容。

  3. 查看每个字段的分析器分配。 分析器可以转换字符串。 因此,索引字符串可能不同于传入的字符串。 可以使用分析文本 (REST) 来评估分析器的效果。 有关分析器的详细信息,请参阅用于处理文本的分析器

在索引编制过程中,索引器仅检查字段名称和类型。 不会执行任何验证步骤来确保传入内容适合索引中对应的搜索字段。

创建索引器

准备好在远程搜索服务上创建索引器时,需要搜索客户端。 搜索客户端可以是 Azure 门户、REST 客户端,还可以是用于实例化索引器客户端的代码。 建议使用 Azure 门户或 REST API 进行早期开发和概念证明测试。

  1. 登录 Azure 门户

  2. 在搜索服务“概述”页上,从两个选项中进行选择:

    • 导入数据向导。 向导的独特之处在于它能创建全部所需元素。 其他方法需要预定义的数据源和索引。

    • 新的索引器,用于指定索引器定义的可视化编辑器。

    以下屏幕截图显示了可以在门户中的哪个位置找到这些功能。

    hotels 索引器

运行索引器

默认情况下,在搜索服务中创建索引器时,该索引器将立即运行。 可通过在索引器定义中将 "disabled" 设置为 true 来替代此行为。 索引器执行是发现连接、字段映射或技能组构造是否出现问题的关键时刻。

可通过多种方式运行索引器:

  • 在创建或更新索引器时运行(默认)。

  • 在没有对定义进行更改时按需运行,或继续重置以进行完整索引编制。 有关详细信息,请参阅运行或重置索引器

  • 计划索引器处理,以定期调用执行。

计划执行通常在需要增量索引时实现,以便你可以获取最新的更改。 因此,计划对更改检测有依赖关系。

索引器是少数几个公开向其他 Azure 资源进行出站调用的子系统之一。 就 Azure 角色而言,索引器没有单独的标识:从搜索引擎到另一个 Azure 资源的连接是使用搜索服务的系统或用户分配的托管标识建立的。 如果索引器连接到虚拟网络上的 Azure 资源,则你应为该连接创建共享专用链接。 有关安全连接的详细信息,请参阅 Azure AI 搜索中的安全性

检查结果

监视索引器状态以检查状态。 即便成功执行,仍可能出现警告和通知。 请务必在成功和失败状态的通知中检查作业的相关详细信息。

对于内容验证,可以针对填充的索引运行可返回整个文档或所选字段的查询

更改检测和内部状态

如果数据源支持更改检测,则索引器可以检测基础数据更改,索引器每次运行时仅处理新文档或已更新的文档,未更改的内容将保持原样。 如果索引器执行历史记录指出运行成功并已处理 0/0 个文档,则意味着索引器在基础数据源中未发现任何新的或者已更改的行或 blob。

更改检测逻辑内置于数据平台。 索引器支持更改检测的方式因数据源而异:

索引器通过内部高水印跟踪从数据源处理的最后一篇文档。 该标记永远不会在 API 中公开,但在内部,索引器会跟踪它的停止位置。 当索引编制通过按计划的运行或按需调用恢复时,索引器将引用高水位线,以便可以从上次停止的位置继续。

如果你需要清除高水位线以便彻底重新编制索引,可以使用重置索引器。 若要更有选择性地重新编制索引,请使用重置技能重置文档。 可以通过重置 API 清除内部状态,如果已启用增量扩充,则还可以刷新缓存。 有关每个重置选项的更多背景信息和比较,请参阅运行或重置索引器、技能和文档

后续步骤