Zvažte použití textového indexu
s $text
hledat
. Může to být mnohem lepší řešení než použití regulárních výrazů. Textové vyhledávání však vrací dokumenty založené na skórovacím algoritmu, takže můžete získat některé výsledky, které neobsahují všechna klíčová slova, která hledáte.
Pokud nemůžete nebo nechcete do tohoto pole přidat textový index, bylo by použití jednoho regulárního výrazu docela nepříjemné, protože neznáte pořadí, ve kterém se tato slova objevují. Netvrdím, že se to nedá napsat, ale skončíte s hroznou ohavností i pro regex standardy. Bylo by mnohem jednodušší použít operátor regulárního výrazu vícekrát pomocí $and
operátor.
Také použití mezery jako oddělovače selže, když je slovo na začátku nebo na konci řetězce nebo po něm následuje tečka nebo čárka. Použijte token hranice slova (\b
).
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
Mějte na paměti, že toto je opravdu pomalý dotaz, protože spustí tyto tři regulární výrazy v každém jednotlivém dokumentu kolekce. Pokud se jedná o dotaz kritický pro výkon, vážně zvažte, zda textový index opravdu nebude fungovat. Pokud se tak nestane, poslední kapkou, kterou bychom měli pochopit, by bylo extrahovat klíčová slova z documenttextfield
pole, které by někdo mohl vyhledat (což může být každé jedinečné slovo v něm), do nového pole documenttextfield_keywords
, vytvořte v tomto poli normální index a vyhledejte v tomto poli pomocí $all
operátor
(v tomto případě není vyžadován žádný regulární výraz).