索引器是搜索服务中的一个命名对象,它通过连接到外部数据源、检索和处理数据,然后将数据传递给搜索引擎进行索引编制,来自动化索引编制工作负载。 使用索引器能够显著减少需要编写的代码的数量和复杂性。

索引器支持两个工作流:

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

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

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

    索引器定义

    创建索引器时,索引器定义将遵循以下两种模式之一:基于文本的索引或包含技能的 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 扩充 。 以上所有属性和参数均适用,但以下额外属性特定于 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 扩充启用缓存

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

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

  • 创建一个可接受传入数据的搜索索引

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

    准备外部数据

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

    你需要将它作为平展行集提供,其中每一行将成为索引中的完整或部分搜索文档。 若要将关系数据平展为行集,应创建一个 SQL 视图,或生成一个查询用于返回同一行中的父记录和子记录。 例如,内置酒店示例数据集是一个 SQL 数据库,拥有 50 条记录(每个酒店一条记录),这些记录关联相关表中的房间记录。 将统一数据平展为行集的查询在每条酒店记录中的 JSON 文档内嵌入所有客房信息。 嵌入的客房信息是使用 FOR JSON AUTO 子句的查询生成的。 可以在 定义返回嵌入式 JSON 的查询 中详细了解此方法。 这只是其中的一个示例;还可以找到其他可生成相同结果的方法。 索引器通常会为每个文件创建一个搜索文档,其中搜索文档包含内容和元数据的字段。 根据具体的文件类型,索引器有时可以 将一个文件解析为多个搜索文档 。 例如,在 CSV 文件中,每一行都可以成为单独的搜索文档。

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

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

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

    准备数据源

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

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

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

  • Azure Blob 存储
  • Azure Cosmos DB
  • Azure SQL 数据库
  • 如果数据源是数据库(例如 Azure SQL 或 Cosmos DB),请启用更改跟踪。 各种数据源的上述链接解释了索引器支持哪些更改跟踪方法。

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

  • 创建搜索索引 开始。

  • 设置字段集合与字段属性。

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

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

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

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

    创建索引器

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

    Azure 门户 .NET SDK

    Postman 应用可以充当索引器客户端。 使用此应用,你可以连接到搜索服务,并发送 创建索引器 (REST) 更新索引器 请求。

    POST /indexers?api-version=[api-version]
      "name": (required) String that uniquely identifies the indexer,
      "dataSourceName": (required) String indicated which existing data source to use,
      "targetIndexName": (required) String,
      "parameters": {
        "batchSize": null,
        "maxFailedItems": null,
        "maxFailedItemsPerBatch": null
      "fieldMappings": [ optional unless there are field discrepancies that need resolution]
    

    有许多教程和示例演示了用于创建对象的 REST 客户端。 可参阅使用 REST 和 Postman 创建搜索索引来入门。

    参阅索引器操作 (REST),获取有关构建索引器请求的帮助。

    对于认知搜索,Azure SDK 实现了正式发布的功能。 因此,可以使用任何 SDK 来创建索引器相关的对象。 所有这些 SDK 都提供一个 SearchIndexerClient,其中包含用于创建索引器和相关对象(包括技能组)的方法。

    Azure SDK

    运行索引器

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

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

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

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

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

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

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

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

    更改检测和内部状态

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

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

  • Microsoft Azure 存储具有内置的更改检测,这意味着索引器可以自动识别新的和更新的文档。 Blob 存储、Azure 表存储和 Azure Data Lake Storage Gen2 为每个 blob 或行更新标记日期和时间。 索引器自动使用此信息来确定要在索引中更新的文档。 有关删除检测的详细信息,请参阅在 Azure 认知搜索中使用 Azure 存储的索引器设置删除检测

  • 云数据库技术在其平台中提供可选的更改检测功能。 对于这些数据源,更改检测不是自动的。 需要在数据源定义中指定要使用哪个更改检测策略:

  • Azure SQL(更改检测)
  • Azure DB for MySQL(更改检测)
  • Azure Cosmos DB for NoSQL(更改检测)
  • Azure Cosmos DB for MongoDB(更改检测)
  • Azure CosmosDB for Apache Gremlin(更改检测)
  • 索引器通过内部“高水位线”跟踪它从数据源处理的最后一个文档。 该标记永远不会在 API 中公开,但在内部,索引器会跟踪它的停止位置。 当索引编制通过按计划的运行或按需调用恢复时,索引器将引用高水位线,以便可以从上次停止的位置继续。

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

  • 从 Azure Blob 存储索引数据
  • 为 Azure SQL 数据库中的数据编制索引
  • 为 Azure Data Lake Storage Gen2 中的数据编制索引
  • 为 Azure 表存储中的数据编制索引
  • 为来自 Azure Cosmos DB 的数据编制索引
  •