Индекс службы поиска Azure, указывающий несколько коллекций БД документов - PullRequest
0 голосов
/ 17 октября 2018

Как загрузить данные из двух отдельных коллекций Azure Cosmos db в один индекс поиска Azure?Мне нужно решение для объединения данных из двух коллекций способом, аналогичным концепции внутреннего объединения SQL, и загрузки этих данных в службу поиска Azure.

У меня есть две коллекции в базе данных Azure Cosmos DB.Один для продукта и образец документов для того же, как показано ниже.

{
   "description": null,
   "links": [],
   "replaces": "00000000-0000-0000-0000-000000000000",
   "replacedBy": "00000000-0000-0000-0000-000000000000",
   "productTypeId": "ccd0bc73-c4a1-41bf-9c96-454a5ba1d025",
   "id": "a4853bf5-9c58-4fb5-a1ff-fc3ab575b4c8",
   "name": "New Product",
   "createDate": "2018-09-19T10:04:35.1951552Z",
   "createdBy": "00000000-0000-0000-0000-000000000000",
   "updateDate": "2018-10-05T13:46:24.7048358Z",
   "updatedBy": "DIJdyXMudaqeAdsw1SiNyJKRIi7Ktio5@clients"
 }
 {
   "description": null,
   "links": [],
   "replaces": "00000000-0000-0000-0000-000000000000",
   "replacedBy": "00000000-0000-0000-0000-000000000000",
   "productTypeId": "ccd0bc73-c4a1-41bf-9c96-454a5ba1d025",
   "id": "b9b6c3bc-a8f8-470f-ac93-be589eb1da16",
   "name": "New Product 2",
   "createDate": "2018-09-19T11:02:02.6919008Z",
   "createdBy": "00000000-0000-0000-0000-000000000000",
   "updateDate": "2018-09-19T11:02:02.6919008Z",
   "updatedBy": "00000000-0000-0000-0000-000000000000"
 }
 {
   "description": null,
   "links": [],
   "replaces": "00000000-0000-0000-0000-000000000000",
   "replacedBy": "00000000-0000-0000-0000-000000000000",
   "productTypeId": "ccd0bc73-c4a1-41bf-9c96-454a5ba1d025",
   "id": "98b3647a-3b40-4a00-bd0f-2a397bd48b68",
   "name": "New Product 7",
   "createDate": "2018-09-20T09:42:28.2913567Z",
   "createdBy": "00000000-0000-0000-0000-000000000000",
   "updateDate": "2018-09-20T09:42:28.2913567Z",
   "updatedBy": "00000000-0000-0000-0000-000000000000"
 }

Другой набор для ProductType с приведенным ниже образцом документа.

{
  "description": null,
  "links": null,
  "replaces": "00000000-0000-0000-0000-000000000000",
  "replacedBy": "00000000-0000-0000-0000-000000000000",
  "id": "ccd0bc73-c4a1-41bf-9c96-454a5ba1d025",
  "name": "ProductType1_186",
  "createDate": "2018-09-18T23:54:43.9395245Z",
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "updateDate": "2018-10-05T13:29:44.019851Z",
  "updatedBy": "DIJdyXMudaqeAdsw1SiNyJKRIi7Ktio5@clients"
}

Идентификатор типа продукта упоминается в коллекции продукта иэто столбец, который связывает обе коллекции.

Я хочу загрузить две вышеупомянутые коллекции в один и тот же индекс службы поиска Azure и ожидаю, что мое поле индекса будет заполнено примерно так, как показано ниже.

enter image description here

1 Ответ

0 голосов
/ 18 октября 2018

Если вы используете идентификатор продукта в качестве ключа, вы можете просто указать два индексатора на один и тот же индекс, и служба поиска Azure объединит документы автоматически.Например, вот два определения индексатора, которые объединяют свои данные в один и тот же индекс:

{ "name" : "productIndexer", "dataSourceName" : "productDataSource", "targetIndexName" : "combinedIndex", "schedule" : { "interval" : "PT2H" } }

{ "name" : "sampleIndexer", "dataSourceName" : "sampleDataSource", "targetIndexName" : "combinedIndex", "schedule" : { "interval" : "PT2H" } }

Подробнее о API создания индексатора здесь

Однако представляется, что две коллекции имеют одни и те же поля.Это означает, что поля документа, который был проиндексирован последним, заменят поля документа, который был проиндексирован первым.Чтобы избежать этого, я бы порекомендовал заменить поля, которые соответствуют шаблону 00000000-0000-0000-0000-000000000000, на null в вашем запросе Cosmos DB.Например:

SELECT productTypeId, (createdBy != "00000000-0000-0000-0000-000000000000" ? createdBy : null) as createdBy FROM products

Этот точный запрос может не работать в вашем случае использования.См. справочник по синтаксису запроса для получения дополнительной информации.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, или что-то работает не так, как ожидалось.

Спасибо, Мэтт

...