Мы заинтересованы в использовании DocumentDb в качестве хранилища данных для ряда источников данных, и поэтому мы запускаем быстрый POC, чтобы установить, соответствует ли он искомым критериям.
Одной из областей, которую мы стремимся предоставить, являются возможности опережающего поиска для определенных полей. Они традиционно предоставляются с использованием синтаксиса SQL LIKE, который в настоящее время не поддерживается.
Поиск в Интернете Я видел, как люди говорили об интеграции поиска Azure, но это оказалось очень дорогостоящим механизмом для такого простого варианта использования.
Я также видел, как люди упоминали об использовании UDF, но это, по-видимому, требует сканирования всей коллекции, что нецелесообразно с точки зрения производительности.
У кого-нибудь есть альтернативные предложения? Одна вещь, которую я рассматривал, заключалась в том, чтобы просто использовать таблицу SQL и инициировать обновление каждый раз, когда документ был вставлен\обновлен\удален?
Ответ 1 · рейтинг 1 · Aravind Krishna R.
DocumentDB поддерживает индексы STARTSWITH и диапазонов для поддержки префиксного/упреждающего поиска.
Вы можете постепенно делать запросы, подобные следующим, в зависимости от того, что ваш пользователь вводит в текстовое поле:
SELECT TOP 10 * FROM hotel H WHERE STARTSWITH(H.name, "H")
SELECT TOP 10 * FROM hotel H WHERE STARTSWITH(H.name, "Hi")
SELECT TOP 10 * FROM hotel H WHERE STARTSWITH(H.name, "Hil")
SELECT TOP 10 * FROM hotel H WHERE STARTSWITH(H.name, "Hilton")
Обратите внимание, что вы должны настроить коллекцию или путь/свойство, которые вы используете для этих запросов, с помощью индекс диапазона. Вы можете расширить этот подход для обработки дополнительных случаев:
Чтобы выполнить запрос без учета регистра, необходимо сохранить строчную форму свойства поиска и использовать ее для запросов.
Ответ 2 · рейтинг 1 · dmcquiggin
Я столкнулся с похожей ситуацией, когда требовался быстрый поиск, когда пользователь вводил условия поиска.
Мой сценарий заключался в том, что потенциально тысячи одновременных пользователей выполняли бы такой поиск; при тестировании этого под нагрузкой, чтобы избежать насыщения и регулирования, мы обнаружили, что нам придется увеличить объем пропускной способности DocumentDB Request Unit (RU) до точки, которая была финансово нецелесообразна для нас в наших конкретных обстоятельствах .
Мы решили, что DocumentDB лучше всего использовать в качестве постоянного хранилища и "полного" извлечения данных - и с этой ролью он справляется исключительно хорошо - в то время как небольшой кластер ElasticSearch выполняет роль, для которой он был разработан - text search, faceted search , weighted search, stemming и наиболее важные для вашего вопроса autocomplete analyzersи completion suggesters.
Тему запросов с опережением ввода, создания индексов, анализатора автозаполнения и времени запроса "поиск по мере ввода" в ElasticSearch можно найти здесь, здесь и здесь
Тот факт, что вы планируете иметь несколько источников данных, также может сделать кластерный подход ElasticSearch более привлекательным для агрегирования данных поиска.
Я использовал шаблон Bitnami, доступный на рынке Azure, для создания относительно небольших экземпляров, и, что наиболее важно, это позволило мне разместить кластер в той же виртуальной сети, что и другие мои компоненты, что значительно повысило производительность.
Стоимость была ниже, чем у Azure Search (в которой используется ElasticSearch).