重要
Azure Cosmos DB for Apache Gremlin 索引器当前在公共预览版阶段,依照 补充使用条款。 目前,没有 SDK 支持。
本文介绍如何配置从 Azure Cosmos DB for Apache Gremlin 导入内容的索引器,并使它在 Azure AI 搜索中可搜索。
本文是对创建索引器的补充,其中包含特定于 Cosmos DB 的信息。 它使用 REST API 演示所有索引器通用的工作流,该工作流包含三个部分:创建数据源、创建索引、创建索引器。 提交“创建索引器”请求时,将提取数据。
由于术语可能会造成混淆,特此提示,Azure Cosmos DB 索引编制和 Azure AI 搜索索引编制属于不同的操作。 在 Azure AI 搜索中编制索引可在搜索服务中创建并加载搜索索引。
先决条件
- 注册预览版以提供方案反馈。 在提交表单后,你可以自动访问该功能。 
- 一个Azure Cosmos DB 帐户、数据库、容器和项目。 对 Azure AI 搜索和 Azure Cosmos DB 使用同一个区域,以降低延迟并避免带宽费用。 
- 针对 Azure Cosmos DB 集合的自动索引策略,设置为“一致”。 这是默认配置。 不建议使用延迟索引,可能会导致数据缺失。 
- 读取权限。 “完全访问权限”连接字符串包括授予对内容的访问权限的密钥,但如果使用的是 Azure 角色,请确保 搜索服务托管标识 具有 Cosmos DB 帐户读取者角色 权限。 
- 一个 REST 客户端,用于创建数据源、索引和索引器。 
定义数据源
数据源定义指定要编制索引的数据、凭据和用于标识数据更改的策略。 数据源定义为独立的资源,以便它可以被多个索引器使用。
对于此调用,请指定 预览版 REST API 版本 ,以创建通过 Azure Cosmos DB for Apache Gremlin 连接的数据源。 可以使用 2021-04-01-preview 或更高版本。 建议使用最新的预览版 API。
- 创建或更新数据源以设置其定义: - POST https://[service name].search.azure.cn/datasources?api-version=2024-05-01-preview Content-Type: application/json api-key: [Search service admin key] { "name": "[my-cosmosdb-gremlin-ds]", "type": "cosmosdb", "credentials": { "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.cn;AccountKey=[cosmos-account-key];Database=[cosmos-database-name];ApiKind=Gremlin;" }, "container": { "name": "[cosmos-db-collection]", "query": "g.V()" }, "dataChangeDetectionPolicy": { "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy", "highWaterMarkColumnName": "_ts" }, "dataDeletionDetectionPolicy": null, "encryptionKey": null, "identity": null } }
- 将 "type" 设置为 - "cosmosdb"(必需)。
- 将“凭据”设置为连接字符串。 下一部分介绍受支持的格式。 
- 将“容器”设置为集合。 “name”属性是必需的,它指定图形的 ID。 - “查询”属性是可选的。 默认情况下,Azure Cosmos DB for Apache Gremlin 的 Azure AI 搜索索引器使图形中的每个顶点都成为索引中的文档。 将忽略边缘。 查询默认值为 - g.V(). 或者,可以将查询设置为仅为边缘编制索引。 若要为边缘编制索引,请将查询设置为- g.E()。
- 如果数据经常变动,且你希望索引器在后续运行时只获取新项和更新的项,则设置“dataChangeDetectionPolicy”。 默认情况下,将通过使用 - _ts作为高水印列来启用增量进度。
- 如果要在删除源项时从搜索索引中删除搜索文档,则设置“dataDeletionDetectionPolicy”。 
受支持的凭据和连接字符串
索引器可以使用以下连接连接到集合。 对于 面向 Azure Cosmos DB for Apache Gremlin 的连接,请确保在连接字符串中包含“ApiKind”。
避免在终结点 URL 中包含端口号。 如果包含端口号,连接将失败。
| 完全访问权限连接字符串 | 
|---|
| { "connectionString" : "AccountEndpoint=https://<Cosmos DB account name>.documents.azure.cn;AccountKey=<Cosmos DB auth key>;Database=<Cosmos DB database id>;ApiKind=MongoDb" } | 
| 可以通过在左窗格中选择 “密钥 ”从 Azure 门户中的 Azure Cosmos DB 帐户页获取连接字符串。 请确保选择完整的连接字符串,而不只是一个密钥。 | 
| 托管标识连接字符串 | 
|---|
| { "connectionString" : "ResourceId=/subscriptions/<your subscription ID>/resourceGroups/<your resource group name>/providers/Microsoft.DocumentDB/databaseAccounts/<your cosmos db account name>/;(ApiKind=[api-kind];)" } | 
| 此连接字符串不需要帐户密钥,但必须事先配置搜索服务以 使用托管身份进行连接 ,并创建一个角色分配以授予 Cosmos DB 帐户读取者角色权限。 有关详细信息,请参阅 使用托管标识设置到 Azure Cosmos DB 数据库的索引器连接 。 | 
将搜索字段添加到索引
在搜索索引中,添加字段以接受源 JSON 文档或自定义查询投影的输出。 确保搜索索引架构与图形兼容。 对于 Azure Cosmos DB 中的内容,搜索索引架构应对应于数据源中的 Azure Cosmos DB 项。
- 创建或更新索引 以定义将存储数据的搜索字段: - POST https://[service name].search.azure.cn/indexes?api-version=2024-05-01-preview Content-Type: application/json api-key: [Search service admin key] { "name": "mysearchindex", "fields": [ { "name": "rid", "type": "Edm.String", "facetable": false, "filterable": false, "key": true, "retrievable": true, "searchable": true, "sortable": false, "analyzer": "standard.lucene", "indexAnalyzer": null, "searchAnalyzer": null, "synonymMaps": [], "fields": [] },{ }, { "name": "label", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "sortable": false, "facetable": false, "key": false, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": "standard.lucene", "synonymMaps": [] }] }
- 创建文档键字段 ("key": true)。 对于已分区集合,默认文档键是 Azure Cosmos DB - _rid属性,Azure AI 搜索会自动将其重命名为- rid,因为字段名称不能以下划线字符开头。 此外,Azure Cosmos DB 的- _rid值包含了在 Azure AI 搜索键中无效的字符。 因此,- _rid值采用 Base64 编码。
- 为更多可搜索内容创建其他字段。 有关详细信息,请参阅创建索引。 
映射数据类型
| JSON 数据类型 | Azure AI 搜索字段类型 | 
|---|---|
| 布尔值 | Edm.Boolean、Edm.String | 
| 类似于整数的数字 | Edm.Int32、Edm.Int64、Edm.String | 
| 类似于浮点的数字 | Edm.Double、Edm.String | 
| String | Edm.String | 
| 基元类型的数组,如 ["a", "b", "c"] | Collection(Edm.String) | 
| 类似于日期的字符串 | Edm.DateTimeOffset、Edm.String | 
| GeoJSON 对象,如 { "type": "Point", "coordinates": [long, lat] } | Edm.GeographyPoint | 
| 其他 JSON 对象 | N/A | 
配置并运行 Azure Cosmos DB 索引器
创建索引和数据源后,便可以准备创建索引器。 索引器配置指定控制运行时行为的输入、参数和属性。
- 通过为索引器命名并引用数据源和目标索引来创建或更新索引器: - POST https://[service name].search.azure.cn/indexers?api-version=2024-05-01-preview Content-Type: application/json api-key: [search service admin key] { "name" : "[my-cosmosdb-indexer]", "dataSourceName" : "[my-cosmosdb-gremlin-ds]", "targetIndexName" : "[my-search-index]", "disabled": null, "schedule": null, "parameters": { "batchSize": null, "maxFailedItems": 0, "maxFailedItemsPerBatch": 0, "base64EncodeKeys": false, "configuration": {} }, "fieldMappings": [], "encryptionKey": null }
- 如果字段名称或类型存在差异,或者需要在搜索索引中使用多个版本的源字段,请指定字段映射。 
- 有关其他属性的详细信息,请参阅创建索引器。 
创建索引器后,它会自动运行。 可以将“已禁用”设置为 true 以防止这种情况。 若要控制索引器执行,请按需运行索引器或按计划运行索引器。
检查索引器状态
若要监视索引器状态和执行历史记录,请发送获取索引器状态请求:
GET https://myservice.search.azure.cn/indexers/myindexer/status?api-version=2024-05-01-preview
  Content-Type: application/json  
  api-key: [admin key]
响应包括状态和已处理的项数。 它应如下例所示:
    {
        "status":"running",
        "lastResult": {
            "status":"success",
            "errorMessage":null,
            "startTime":"2022-02-21T00:23:24.957Z",
            "endTime":"2022-02-21T00:36:47.752Z",
            "errors":[],
            "itemsProcessed":1599501,
            "itemsFailed":0,
            "initialTrackingState":null,
            "finalTrackingState":null
        },
        "executionHistory":
        [
            {
                "status":"success",
                "errorMessage":null,
                "startTime":"2022-02-21T00:23:24.957Z",
                "endTime":"2022-02-21T00:36:47.752Z",
                "errors":[],
                "itemsProcessed":1599501,
                "itemsFailed":0,
                "initialTrackingState":null,
                "finalTrackingState":null
            },
            ... earlier history items
        ]
    }
执行历史记录包含最多 50 个最近完成的执行,它们按时间倒序排列,这样最新的执行最先显示。
为新文档和已更改的文档编制索引
索引器完全填充搜索索引后,建议运行后续的索引器,以便仅对数据库中的新文档和已更改的文档进行增量索引编制。
若要启用增量索引编制,请在数据源定义中设置“dataChangeDetectionPolicy”属性。 此属性告知索引器对数据使用哪种更改跟踪机制。
对于 Azure Cosmos DB 索引器,唯一支持的策略是使用 Azure Cosmos DB 提供的 HighWaterMarkChangeDetectionPolicy(时间戳)属性的 _ts。
以下示例演示具有更改检测策略的数据源定义:
"dataChangeDetectionPolicy": {
    "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
"  highWaterMarkColumnName": "_ts"
},
为已删除的文档编制索引
删除图形数据时,可能还需要从搜索索引中删除相应的文档。 数据删除检测策略的目的是有效地识别已删除的数据项,并从索引中删除完整文档。 数据删除检测策略不应删除部分文档信息。 目前,唯一支持的策略是 Soft Delete 策略(删除标有某种类型的标志),它在数据源定义中指定如下:
"dataDeletionDetectionPolicy"": {
    "@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
    "softDeleteColumnName" : "the property that specifies whether a document was deleted",
    "softDeleteMarkerValue" : "the value that identifies a document as deleted"
}
下面的示例创建具有软删除策略的数据源:
POST https://[service name].search.azure.cn/datasources?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [Search service admin key]
{
    "name": "[my-cosmosdb-gremlin-ds]",
    "type": "cosmosdb",
    "credentials": {
        "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.cn;AccountKey=[cosmos-account-key];Database=[cosmos-database-name];ApiKind=Gremlin"
    },
    "container": { "name": "[my-cosmos-collection]" },
    "dataChangeDetectionPolicy": {
        "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
        "highWaterMarkColumnName": "`_ts`"
    },
    "dataDeletionDetectionPolicy": {
        "@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
        "softDeleteColumnName": "isDeleted",
        "softDeleteMarkerValue": "true"
    }
}
即使启用删除检测策略,也不支持从索引中删除复杂 (Edm.ComplexType) 字段。 此策略要求 Gremlin 数据库中的“活动”列的类型为整数、字符串或布尔值。
将图形数据映射到搜索索引中的字段
Azure Cosmos DB for Apache Gremlin 索引器会自动映射几个图形数据:
- 索引器将 - _rid映射到索引中的- rid字段(如果存在),并将其进行 Base64 编码。
- 索引器会将 - _id映射到索引中的- id字段(如果存在)。
- 使用 Apache Gremlin 查询 Azure Cosmos DB 数据库时,你可能会注意到每个属性的 JSON 输出中都有 - id和- value标签。 索引器将自动将属性映射到搜索索引中与属性- value同名的字段(如果存在)。 在以下示例中,450 将映射到- pages搜索索引中的字段。
    {
        "id": "Cookbook",
        "label": "book",
        "type": "vertex",
        "properties": {
          "pages": [
            {
              "id": "48cf6285-a145-42c8-a0aa-d39079277b71",
              "value": "450"
            }
          ]
        }
    }
你可能会发现需要使用 输出字段映射 ,以便将查询输出映射到索引中的字段。 你可能想要使用输出字段映射,而不是 字段映射, 因为自定义查询可能具有复杂的数据。
例如,假设查询生成以下输出:
    [
      {
        "vertex": {
          "id": "Cookbook",
          "label": "book",
          "type": "vertex",
          "properties": {
            "pages": [
              {
                "id": "48cf6085-a211-42d8-a8ea-d38642987a71",
                "value": "450"
              }
            ],
          }
        },
        "written_by": [
          {
            "yearStarted": "2017"
          }
        ]
      }
    ]
如果要将上述 pages JSON 中的值totalpages映射到索引中的字段,可以将以下输出字段映射添加到索引器定义:
    ... // rest of indexer definition 
    "outputFieldMappings": [
        {
          "sourceFieldName": "/document/vertex/pages",
          "targetFieldName": "totalpages"
        }
    ]
请注意输出字段映射以 /document 开头,并且没有包括对 JSON 中属性键的引用。 这是因为索引器在引入图形数据时将每个文档放在节点下/document,索引器还自动允许通过简单的引用pages来引用值pages,而无需引用数组pages中的第一个对象。
后续步骤
- 若要了解有关 Azure Cosmos DB for Apache Gremlin 的详细信息,请参阅 Azure Cosmos DB 简介:适用于 Apache Gremlin 的 Azure Cosmos DB。 
- 有关 Azure AI 搜索方案和定价的详细信息,请参阅 azure.microsoft.com 上的“搜索服务”页。 
- 若要了解索引器的网络配置,请参阅 索引器对受 Azure 网络安全功能保护的内容的访问。