Запрос Mongodb по регулярному выражению - PullRequest
2 голосов
/ 29 августа 2011

Я использую Mongodb для хранения списка местоположений по всему миру, с более чем 2 миллионами записей. Каждая запись представляет собой такой объект:

{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" }

Я хочу выполнить поиск, чтобы получить все "CITIES", содержащие "New York", мне потребовалось около 10 секунд, чтобы получить результат (это недопустимо в моей веб-системе). Я проиндексировал «город» с помощью функции sureIndex (), но запрос все еще медленный.

Вот мой запрос:

db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }})

Полагаю, проблема в "регулярном выражении". Можете ли вы предложить мне решение для этого, чтобы получить результат запроса в течение 2-3 секунд (у меня более 4 миллионов записей в MySQL, аналогичный запрос занял у меня всего 1-2 секунды - с индексами).

Спасибо и всего наилучшего.

Ответы [ 3 ]

8 голосов
/ 29 августа 2011

Вы не можете выполнять поиск с помощью операции содержимого в mongodb без использования регулярных выражений или javascript (они медленные, из-за работы без индекса).

Я могу предложить сохранить дополнительный город в нижнем регистре и выполнить поиск по полнойматч.Если вы хотите «содержать» и быструю скорость, вы должны использовать другие полнотекстовые поисковые системы, такие как solr или lucene .

3 голосов
/ 29 августа 2011

Я рекомендую использовать несколько клавиш.

пример:

{ title : "this is fun" ,
  _keywords : [ "this" , "is" , "fun" ]
}

тогда вы можете использовать

 db.articles.findOne( { _keywords: "this" } )

это будет быстрее

2 голосов
/ 29 августа 2011

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

Вместо поиска, содержащего, если вы начинаете поиск, как показано ниже

db.locations.find({"city": { "$regex": /^New York/}}) 

ваш запрос будет быстро возвращаться.1006 *

для получения дополнительной информации RegularExpressions

...