Невозможно отобразить вложенное поле источника данных cosmos db в поле корневого индекса индексатора Azure с помощью API REST - PullRequest
1 голос
/ 07 октября 2019

У меня есть коллекция mongo db users со следующим форматом данных

{
    "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 также ничего не говорит об этом типе отображения. Так что если кто-нибудь может мне помочь в этом, это будет очень цениться.

Ответы [ 3 ]

1 голос
/ 07 октября 2019

Поддержка API-интерфейса MongoDb находится в открытом предварительном просмотре - вам необходимо явно указать Mongo в строке подключения источника данных, как описано в этой статье . Также обратите внимание, что в источниках данных Mongo пользовательские запросы, предложенные в предыдущем ответе, не поддерживаются. Надеюсь, кто-то из команды уточнит текущее состояние этой поддержки.

1 голос
/ 07 октября 2019
Элемент

container в определении источника данных позволяет указать query, который можно использовать для выравнивания документа JSON (Ref: 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)
0 голосов
/ 07 октября 2019

Это работает для меня с отображением поля ниже правильно. Поисковый запрос 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-Preview

...