无法使用REST API将cosmos db的嵌套数据源字段映射到Azure索引器的根索引字段

问题描述 投票:1回答:3

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

{
    "name": "abc",
    "email": "[email protected]"
    "address": {
        "city": "Gurgaon",
        "state": "Haryana"
    }
}

现在,我正在使用天蓝色的REST API为该集合创建数据源,索引和索引器。

数据源

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文档也没有提及这种映射。因此,如果有人可以帮助我,将不胜感激。

azure azure-cosmosdb azure-search
3个回答
1
投票
数据源定义中的

container元素允许您指定可用于展平JSON文档(参考:query)的https://docs.microsoft.com/en-us/rest/api/searchservice/create-data-source,因此您可以编写查询来代替在索引器定义中进行列映射并以所需的格式获取输出。

在这种情况下,您用于创建数据源的代码将是:

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

1
投票

在公共预览中提供对MongoDb API风味的支持-您需要按照this article中的说明在数据源的连接字符串中明确指出Mongo。还要注意,对于Mongo数据源,不支持由上一个响应建议的自定义查询afaik。希望团队中的某人能够澄清此支持的当前状态。


0
投票

对我来说,以下字段映射正确无误。 Azure搜索查询正确返回地址值。

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

例如,我确实没有对您提供的数据进行任何更改

  1. 创建索引器时,在末尾删除了多余的逗号字段映射
  2. 创建索引时,电子邮件字段保留在Edm.String,而不是datetimeoffset。

由于MongoDB API在Azure搜索的预览模式下,请确保您使用的是预览API版本。例如https:// {azure搜索名称} .search.windows.net / indexers?api-version = 2019-05-06-预览

© www.soinside.com 2019 - 2024. All rights reserved.