2013-07-06 1 views
20

Я хочу найти учетную запись по имени (в коллекции MongoDB из 50K счетов)MongoDB, выполнение запроса регулярным выражением на индексированных полей

Обычным образом: мы находим шпагатом

db.accounts.find({ name: 'Jon Skeet' }) // indexes help improve performance! 

Как насчет регулярного выражения? Это дорогостоящая операция?

db.accounts.find({ name: /Jon Skeet/ }) // worry! how indexes work with regex? 

Редактировать:

Согласно WiredPrairie:
MongoDB использовать префикс из RegEx для поиска индексов (например: /^prefix.*/):

db.accounts.find({ name: /^Jon Skeet/ }) // indexes will help!' 

MongoDB $regex

+6

@ dirkk, я хочу получить больше опыта и объяснений. Я также хочу поделиться этим вопросом. – damphat

+2

Чтобы регулярное выражение использовало индекс, он должен использовать якорь, как показано в документах: http://docs.mongodb.org/manual/reference/operator/regex/ – WiredPrairie

+0

Возможный дубликат [Как запросить mongodb с "like" ?] (http://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like) – WiredPrairie

ответ

20

На самом деле в соответствии с документацией,

Если индекс существует для поля, то MongoDB соответствует регулярному выражению против значений в индексе, которые могут быть быстрее, чем сканирование в коллекции. Дальнейшая оптимизация может произойти, если регулярное выражение является «префиксным выражением», что означает, что все потенциальные совпадения начинаются с одной и той же строки. Это позволяет MongoDB построить из этого префикса «диапазон» и соответствовать только этим значениям из индекса , которые попадают в этот диапазон.

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

Другими словами:

Для/Jon тарелочкам/регулярное выражение, Монго будет полное сканирование ключей в индексе, то будет получать совпавшие документы, которые могут быть быстрее, чем сбор сканирования.

Для/^ Jon Skeet/regex, mongo сканирует только диапазон, начинающийся с регулярного выражения в индексе, который будет быстрее.

+1

regex отлично работает, если есть немедленное совпадение (т. Е. Соответствие букве 'a'). Но если я совпадаю с полным словом, результаты занимают намного больше времени (т. Е. «Угловое»). Это через 6M документов, есть ли способ ускорить эти запросы? Они берут от 19 до 30 секунд для 8+ персонажей, но возвращаются сразу с 1-2 символами. – chovy

+0

@chovy, я считаю, что MongoDB не лучший инструмент для поиска строк в середине текста - я предлагаю посмотреть ElasticSearch или любые другие полнотекстовые поисковые системы. – heroin

 Смежные вопросы

  • Нет связанных вопросов^_^