Я добавляю простые функции поиска для своих пользователей в свое приложение и настоятельно рекомендую использовать Azure CosmosDB. Документы в моей базе данных Cosmos (Azure) представляют телефонные звонки и выглядят следующим образом:
{
"id": "JKEeW3aebSEAzUA",
"partitionKey": "191625028",
"ownerId": "191625028",
"callTime": "2020-06-12T22:13:18.271+00:00",
"direction": "Inbound",
"action": "Phone Call",
"result": "Accepted",
"callers": [
{
"phoneNum": "9182914018",
"name": "JENKS OK",
"location": "Jenks, OK"
},
{
"phoneNum": "9189406524",
"name": "Main IVR",
"location": null
},
{
"phoneNum": null,
"name": "Main IVR",
"location": null,
}
]
}
Я собираюсь предоставить возможность поиска на основе вложенных свойств phoneNum
, name
и location
в каждом элементе callers
. Я рассматриваю возможность использования этого запроса:
SELECT c.id,a.phoneNum,c.callers
FROM c join a in c.callers
where CONTAINS(a.phoneNum, '4018')
Является ли это наиболее эффективным способом выполнения такого поиска? Я готов реструктурировать свои документы, чтобы ускорить поиск в этих полях. Некоторые моменты, на которые следует обратить внимание:
- Это мультитенантная система, и мы используем схему «раздел на каждого арендатора» в этой конкретной базе данных.
- Некоторые разделы / арендаторы будут иметь более 1 000 000 записей вызовов и 3 000 000 - 4 000 000 вложенных записей вызывающих абонентов после завершения импорта данных.
Я новичок в Azure CosmosDB. В настоящее время мы предоставляем ограниченные возможности поиска, аналогичные этой, через сервер SQL. Эта структура идентична нашей структуре на SQL сервере (записи родительских вызовов, записи дочерних вызывающих).