Compartilhar via

在 Azure AI Search 中创建索引器

本文介绍创建索引器的基本步骤,用于自动引入受支持数据源的数据。 根据数据源和工作流,可能需要更多配置。

可以使用索引器在 Azure AI Search 中自动执行数据导入和索引编制。 索引器是搜索服务上的命名对象,它连接到外部 Azure 数据源、读取和序列化数据,并将其传递给搜索引擎进行索引。 使用索引器可显著减少为支持的数据源编写的代码量和复杂性。

索引器支持两个工作流:

  • 原始内容索引(纯文本或向量):从全文搜索方案的文本内容中提取字符串和元数据。 它还提取矢量搜索的原始矢量内容(例如,Azure SQL 数据库或 Azure Cosmos DB 集合中的矢量)。 在此工作流中,索引仅发生在你提供的现有内容上。

  • 基于技能的索引:通过生成新的可搜索内容的内置技能或自定义技能扩展索引。 例如,可以添加集成machine learning,以便对图像和非结构化文本进行分析、提取或推断文本和结构。 还可以使用技能对文本和图像中的内容进行分块和矢量化。 基于技能的索引生成外部数据源中不存在的新内容。 将字段添加到接受传入数据的索引架构时,新内容将成为索引的一部分。 若要了解详细信息,请参阅 Azure AI Search 中的 AI 增强

先决条件

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

  • 一个 数据源 定义,用于设置与外部数据的连接。

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

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

索引器模式

创建索引器时,定义遵循以下两种模式之一: 基于内容的索引基于技能的索引编制。 模式类似,但基于技能的索引包括额外的属性。

基于内容的索引的索引器示例

全文搜索或矢量搜索的基于内容的索引是索引器的主要用例。 对于此工作流,索引器类似于此示例。

{
  "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 扩充: skillsetNamecacheoutputFieldMappings

{
  "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 Search 的技能集创建技能集合映射增强的输出字段为 AI 增强启用缓存开始。

准备外部数据

索引器使用数据集。 运行索引器时,它会连接到数据源,从容器或文件夹中检索数据,可以选择将其序列化为 JSON,然后将其传递给搜索引擎进行索引。 本部分介绍基于文本的索引的传入数据要求。

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

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

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

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

  • 可搜索数据是文本或矢量
  • 可筛选数据是文本和数字(非矢量字段)

Azure AI Search不能以任何格式对二进制数据执行全文搜索,尽管它可以提取和推断图像文件的文本说明(请参阅 AI 扩充)来创建可搜索的内容。 同样,可通过自然语言模型划分和分析大文本,以查找结构或相关信息,并生成可添加到搜索文档中的新内容。 它还可以执行向量搜索,包括对二进制格式的量化嵌入进行搜索。

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

准备数据源

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

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

  2. 创建一个数据源定义。 以下数据源是较为常用的一些源:

  3. 如果数据源是数据库(如 Azure SQL 或 Cosmos DB),请启用change tracking。 Azure Storage通过每个 blob、文件和表上的 LastModified 属性内置change tracking。 各种数据源的链接说明了索引器支持哪些变更跟踪方法。

准备索引

索引器还需要搜索索引。 回想一下,索引器将数据传递到搜索引擎进行索引。 正如索引器具有决定执行行为的属性一样,索引架构也有属性会深刻影响字符串的编制索引方式(仅对字符串字段进行分析和标记化)。

  1. 创建搜索索引开始。

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

    字段是传入内容的唯一目标。 根据架构中的字段属性,每个字段值会被分析、标记化,或存储为用于筛选器、模糊搜索和自动完成查询的逐字字符串。

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

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

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

创建索引器

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

  1. 登录到 Azure portal 并选择您的 Search Service。

  2. 从以下选项中进行选择:

    • 导入向导:向导是唯一的,因为它们创建了所有必需的元素。 其他方法需要预定义的数据源和索引。

      显示导入数据向导的屏幕截图。

    • 添加索引器:用于指定索引器定义的可视化编辑器。

      显示“添加索引器”按钮的屏幕截图。

运行索引器

默认情况下,当在搜索服务上创建索引器时,它会立即运行。 可通过在索引器定义中将 disabled 设置为 true 来替代此行为。 索引器执行是一个关键时刻,让你了解连接、字段映射或技能集构造是否存在问题。

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

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

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

  • 计划索引器处理以定期触发执行。

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

索引器是少数对其他 Azure 资源进行显式出站调用的子系统之一。 在 Azure 角色的上下文中,索引器没有单独的标识;搜索引擎通过搜索服务的系统或用户分配的托管标识与另一个 Azure 资源连接。 如果索引器连接到虚拟网络上的 Azure 资源,则应为该连接创建一个共享私有链接。 有关安全连接的详细信息,请参阅 Azure AI Search 中的 安全性。

检查结果

监视索引器状态 以检查执行状态。 成功执行仍可以包含警告和通知。 请务必在成功和失败的状态通知中查看作业的详细信息。

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

更改检测和内部状态

如果数据源支持更改检测,则索引器可以检测基础数据更改,索引器每次运行时仅处理新文档或已更新的文档,未更改的内容将保持原样。 如果索引器执行历史记录显示运行成功且已处理 0/0 个文档,这意味着索引器在基础数据源中没有找到任何新的或已更改的行或 Blob。

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

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

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