Betrachten wir ein text index mit einem $text
search verwenden. Es könnte eine weitaus bessere Lösung als die Verwendung regulärer Ausdrücke sein. Die Textsuche gibt jedoch Dokumente basierend auf einem Bewertungsalgorithmus zurück, sodass Sie möglicherweise Ergebnisse erhalten, die nicht alle gesuchten Schlüsselwörter enthalten.
Wenn Sie diesem Feld keinen Textindex hinzufügen können oder wollen, wäre die Verwendung eines einzelnen regulären Ausdrucks ziemlich schmerzhaft, weil Sie die Reihenfolge nicht kennen, in der diese Wörter angezeigt werden. Ich behaupte nicht, dass es unmöglich ist, zu schreiben, aber Sie werden selbst für Regex-Standards mit einer schrecklichen Abscheulichkeit enden. Es wäre viel einfacher, den Regex-Operator mehrfach zu verwenden, indem der Operator $and
verwendet wird.
Außerdem wird die Verwendung eines Leerzeichens als Delimeter fehlschlagen, wenn das Wort am Anfang oder Ende der Zeichenfolge steht oder auf einen Punkt oder ein Komma folgt. Verwenden Sie stattdessen das Wortgrenzen-Token (\b
).
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
Denken Sie daran, dass dies eine wirklich langsamen Abfragen, weil es diese drei regulären Ausdrücke auf jedem einzelnen Dokument der Sammlung laufen. Wenn es sich um eine performance-kritische Abfrage handelt, sollten Sie ernsthaft überlegen, ob ein Textindex wirklich nicht funktioniert. Wenn dies nicht gelingt, wäre das letzte Strohhalm, um zu greifen, irgendwelche Schlüsselwörter aus dem Feld documenttextfield
, nach dem jemand suchen könnte (was jedes eindeutige Wort darin sein könnte), in ein neues Array-Feld documenttextfield_keywords
, einen normalen Index für dieses Feld zu erstellen und zu suchen auf diesem Feld mit der $all
operator (kein regulärer Ausdruck in diesem Fall erforderlich).
Ein einzelner regulärer Ausdruck hilft Ihnen nicht, wenn Sie nicht wissen, in welcher Reihenfolge die Schlüsselwörter angezeigt werden. Haben Sie einen [Textindex] (https://docs.mongodb.org/manual/core/index-text/) in Erwägung gezogen? – Philipp