2017-01-13 6 views
0

У меня есть запрос, который может быть слишком сложным для MongoDB для его быстрого выполнения. Если есть вещи, которые я могу изменить в настройке моего MongoDB, я бы хотел узнать!Ускорение запроса MongoDB с Regex

Ниже приведен пример запроса, который является поиск коллекции рабочих мест для термина «API»

db.jobs.find(
    { 
    'budget': {'$exists': true, '$ne': ''}, 
    '$or': [ 
     {'title': /(^|[\\s.,])api.*/gi}, 
     {'query': /api'/gi}, 
     {'description': /(^|[\\s.,])api.*/gi} 
    ] 
    } 
) 

Это заканчивается, принимая более 3 секунд, чтобы перебежать 32000 документов (выдержка из MongoDB Profiler):

"ntoreturn" : 0, 
"ntoskip" : 0, 
"nscanned" : 0, 
"nscannedObjects" : 34266, 
"keyUpdates" : 0, 
"writeConflicts" : 0, 
"numYield" : 274, 

Я думал о добавлении индекса по любому типу, запросу, описанию, но MongoDB разрешает только один текстовый индекс на коллекцию, в то время как у меня есть три строковых поля (название, запрос, описание), которые я запрашиваю.

+0

Вы можете заменить чередование на '\ b'? также вы должны отменить его '[\ s.,] | ^' скорее всего, так как первый случай должен быть самым обычным. – sweaver2112

+2

вы можете создать текстовый индекс по любому числу полей. 'db.jobs.createIndex ( { title:" text ", query:" text ", description:" text " } )'. Попробуйте и посмотрите, улучшит ли ваше время ответа на запрос. – Veeram

+1

IMO, вам нужно просмотреть свои регулярные выражения. И [связанный вопрос] (http://stackoverflow.com/q/17501798/4519059);). –

ответ

0

Решение заключалось в создании текстового индекса, основанного на трех полях. Я не знал, что Монго разрешил вам использовать несколько полей для текстового индекса. Идти супер быстро!