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



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

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

现在,我将使用 Azure 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)

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

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 文档也没有说明此类映射。因此,如果有人能在这方面帮助我,将不胜感激。

数据源定义中的container元素允许你指定可用于平展 JSON 文档的query(Ref: https://learn.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)

对 MongoDb API 风格的支持以公共预览版提供 - 需要在本文中在数据源的连接字符串中显式指示 Mongo。另请注意,对于 Mongo 数据源,不支持 afaik 上一个响应建议的自定义查询。希望团队中的某个人能够澄清这种支持的当前状态。

它对我有用,下面的字段映射正确。Azure 搜索查询正确返回地址值。

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

我确实对您提供的数据进行了一些更改,例如

  1. 创建索引器时,删除了 字段映射
  2. 创建索引时,电子邮件字段保持在 Edm.String 而不是 datetimeoffset。

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

最新更新