首页 > 解决方案 > 无法使用 REST API 将 cosmos db 的嵌套数据源字段映射到 Azure 索引器的根索引字段

问题描述

我有一个users具有以下数据格式的 mongo db 集合

{
    "name": "abc",
    "email": "abc@xyz.com"
    "address": {
        "city": "Gurgaon",
        "state": "Haryana"
    }
}

现在我正在使用 azure rest apis 为这个集合创建一个数据源、一个索引和一个索引器。

数据源

def create_datasource():
  request_body = {
      "name": 'users-datasource',
      "description": "",
      "type": "cosmosdb",
      "credentials": {
          "connectionString": "<db conenction url>"
      },
      "container": {"name": "users"},
      "dataChangeDetectionPolicy": {
          "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
          "highWaterMarkColumnName": "_ts"
      }
  }
  resp = requests.post(url="<create-datasource-api-url>", data=json.dumps(request_body), 
    headers=headers)

上述数据源的索引

def create_index(config):

  request_body = {
      'name': "users-index",
      'fields': [
          {
              'name': 'name',
              'type': 'Edm.String'
          },
          {
              'name': 'email',
              'type': 'Edm.DateTimeOffset'
          },
          {
              'name': 'address',
              'type': 'Edm.String'
          },
          {
              'name': 'doc_id',
              'type': 'Edm.String',
              'key': True
          }
      ]
  }
  resp = requests.post(url="<azure-create-index-api-url>", data=json.dumps(request_body), 
    headers=config.headers)

现在是上述数据源和索引的索引器

def create_interviews_indexer(config):
  request_body = {
    "name": "users-indexer",
    "dataSourceName": "users-datasource",
    "targetIndexName": users-index,
    "schedule": {"interval": "PT5M"},
    "fieldMappings": [
        {"sourceFieldName": "address.city", "targetFieldName": "address"},
    ]
  }
  resp = requests.post("create-indexer-pi-url", data=json.dumps(request_body), 
      headers=config.headers)

这毫无例外地创建了索引器,但是当我在 azure 门户中检查检索到的数据时users-indexer,该address字段是null并且没有从address.city创建索引器时提供的字段映射中获取任何值。

我也尝试过以下代码作为映射,但它也不起作用。

"fieldMappings": [
        {"sourceFieldName": "/address/city", "targetFieldName": "address"},
    ]

azure 文档也没有说明这种映射。因此,如果有人可以帮助我,将不胜感激。

标签: azureazure-cosmosdbazure-cognitive-search

解决方案


对 MongoDb API 风格的支持是公共预览版 - 您需要在数据源的连接字符串中明确指出 Mongo,如本文所述。另请注意,对于 Mongo 数据源,afaik 不支持先前响应建议的自定义查询。希望团队中的某个人能够澄清这种支持的当前状态。


推荐阅读