Обмислете използването на текстов индекс
с $text
търсене
. Може да е много по-добро решение от използването на регулярни изрази. Търсенето на текст обаче връща документи въз основа на алгоритъм за оценка, така че може да получите някои резултати, които нямат всички ключови думи, които търсите.
Ако не можете или не искате да добавите текстов индекс към това поле, използването на един регулярен израз би било доста трудно, защото не знаете реда, в който се появяват тези думи. Не твърдя, че е невъзможно да се напише, но в крайна сметка ще получите ужасна мерзост дори за стандартите за регулярни изрази. Би било много по-лесно да използвате оператора regex многократно, като използвате $and
оператор.
Освен това използването на интервал като разделител ще се провали, когато думата е в началото или края на низа или е последвана от точка или запетая. Използвайте маркера за граница на думата (\b
) вместо това.
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
Имайте предвид, че това е наистина бавна заявка, защото ще изпълни тези три регулярни израза на всеки един документ от колекцията. Когато това е критична за производителността заявка, помислете сериозно дали текстов индекс наистина няма да свърши работа. Ако не успеете, последната сламка, която трябва да хванете, ще бъде да извлечете всякакви ключови думи от documenttextfield
поле, което някой може да търси (което може да е всяка уникална дума в него) в ново поле за масив documenttextfield_keywords
, създайте нормален индекс в това поле и търсете в това поле с $all
оператор
(в този случай не се изисква регулярен израз).