2015-05-09 5 views
1

В настоящее время мы запускаем наше приложение в MySQL и планируем перейти на MongoDB. Мы уже переместили некоторые части, но с проблемами MongoRegex.MongoDB search - autocomplete

У нас есть окно поиска автозаполнения, которое объединяет 6 таблиц (индексированные/неиндексированные поля) и возвращает результаты супер быстро на mysql. То же самое на MongoDB работает очень медленно. Это займет около 2,3 секунд только в одной коллекции. Пользователь должен долго ждать. Время соединения составляет 0,064 секунды. Время запроса 2,36 секунды. Я немного поработал в Google и не смог найти идеального ответа. Все говорили, что MongoRegex идет медленно. Если это правда, как другие компании преодолевают эту проблему?

Что является лучшим способом повысить производительность/опыт автозаполнения при работе на MongoDB?

+0

Поскольку это для какой-либо функции автозаполнения, ваш шаблон имеет префикс фиксированной строки. Что-то вроде 'Mongo. *'/'Mongo%'. Итак, как дикая догадка, возможно, в конечном итоге возможно MySQL будет оптимизировать поиск RE/LIKE, если левый префикс является постоянным, чтобы использовать индекс. Может быть, в конце концов, возможно, MongoDB не способен к тому же? У вас есть правильный индекс в этом поле? –

+0

Возможный дубликат [Реализация функции автозаполнения с использованием поиска MongoDB] (http://stackoverflow.com/questions/29892947/implement-auto-complete-feature-using-mongodb-search) –

ответ

0

Трудно сказать, поскольку у нас нет поискового запроса, но стоит упомянуть, что, взглянув на документацию, кажется, что MongoDB может использовать индекс при использовании поиска RE, если шаблон приставка постоянной строкой только если оно закреплено:

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

Итак, цитирует документ:

регулярного выражением является «выражением префикса», если она начинается с кареткой (^) или левый якорь (\ A), за которым следует строка простых символов. Например, регулярное выражение /^abc.*/ будет оптимизировано путем сопоставления только со значениями из индекса, которые начинаются с abc.

Но /abc.*/ ou /^.*abc/ не использует индекс.

+0

Если это стандартное регулярное выражение, это должен также: '/^abc /' –

+0

@ Rick О да. Конечно: любое префиксное выражение будет работать. –

0

Прежде всего, вам нужно будет тщательно спроектировать ваш запрос. Осторожно, как в, правильно отбирать правильно проиндексированные поля и соответственно разрабатывать. Также, если вы используете regex, убедитесь, что вы пишете регулярное выражение таким образом, чтобы заставить запрос использовать индексированное поле. Что-то вроде префикса/^ будет. [См. Эту ссылку: http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use]

Я видел много реализаций, используя запрос диапазона mongodb, но Im не уверен, что это лучший, поскольку мгновенные результаты - это ключевая вещь.

Кроме того, я видел тех, кто рекомендовал префикс-деревья. Что эффективно сохраняет префиксы в поле, а затем сохраняет все слова, начиная с этого конкретного префикса, в следующих полях в виде массива. Это решение кажется убедительным и быстрым, поскольку поля префикса должны быть проиндексированы, но вам также придется подумать о коэффициенте хранения.