Textsuche verwenden
Mit den Textsuchfunktionen in Firestore mit MongoDB-Kompatibilität können Sie in einer Sammlung nach bestimmten Strings suchen.
Hinweis
Bevor Sie mit der Verwendung von Textsuchanfragen beginnen, sollten Sie Folgendes tun:
Sie benötigen Zugriff auf eine vorhandene MongoDB-kompatible Datenbank für Vorgänge oder müssen eine Datenbank erstellen und eine Verbindung zu ihr herstellen.
Achten Sie darauf, dass Sie einen Textindex haben, oder erstellen Sie einen Textindex.
Textsuche ausführen
Bei der Textsuche wird der Operator $text in einem Filter verwendet.
Geben Sie den abgefragten String im Argument $search an.
Allgemeine Textsuche durchführen
Führen Sie den folgenden Befehl aus, um eine allgemeine Textsuche durchzuführen:
# Find search
db.cities.find({ $text: { $search: "french bread" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "french bread" } } }
]);
Wenn Ihr Index partitioniert ist, können Sie nach der Partition filtern, indem Sie die Partition in einen Gleichheitsfilter vom Typ „and“ in Ihre Suche einbeziehen.
Wenn Sie beispielsweise eine city-Partition haben, können Sie eine Textsuche so filtern:
db.myCollection.find( { $and: [
{ $text: { $search: "french bread" } },
{ "city": "Paris" }
] } )
Sie können eine Aggregation auch nach einer Partition filtern. Beispiel:
db.myCollection.aggregate([
{ $match: { $text: { $search: "french bread" } } },
{ "city": "Paris" }
] );
Der Wert Ihrer Partition muss ein String sein. Ihr Partitionsfilter muss mit „and“ mit der Textsuche verknüpft werden.
Sprache für die Textsuche festlegen
Sie können die Sprache für die Textsuche mit dem Argument $language festlegen. Beispiel:
db.cities.find({ $text: { $search: "french bread", $language: "en"} })
Wenn Sie keine Sprache festlegen, wird für die Suche die Sprache des Textindex verwendet.
Nach einem exakten Begriff suchen
Wenn Sie nach einem genauen Begriff suchen möchten, konfigurieren Sie den Begriff als eine Wortfolge, die in doppelte Anführungszeichen eingeschlossen ist. Beispiel:
# Find search
db.cities.find({ $text: { $search: "\"best french bread\"" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best french bread\"" } } },
]);
Nach einer Begriffskombination suchen
Wenn Sie Ihre Textsuche präziser gestalten möchten, geben Sie eine Kette von Begriffen an. Die folgende Suche gibt beispielsweise Dokumente zurück, die der Kombination best AND french AND ("bread" OR "is") entsprechen:
# Find search
db.cities.find({ $text: { $search: "\"best\" \"french\" bread is" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "\"best\" \"french\" bread is" } } },
]);
Begriff ausschließen
Wenn Sie einen Begriff aus einer Textsuche ausschließen möchten, setzen Sie dem Begriff einen Bindestrich (-) voran:
# Find search
db.cities.find({ $text: { $search: "best bread -french"} })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best bread -french" } } },
]);
Relevanzwert berechnen
Verwenden Sie den Ausdruck {$meta: "textScore"}, um den Relevanzwert der Dokumente zu berechnen, die mit der Textsuche übereinstimmen. Wenn Sie die Ergebnisse in absteigender Reihenfolge nach Punktzahl sortieren möchten, verwenden Sie $meta in einem Sortierausdruck. Betrachten Sie die folgenden Beispiele, wobei SCORE_FIELD der Name des Felds ist, in dem der Punktwert gespeichert wird:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.sort({ SCORE_FIELD: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $sort: { "SCORE_FIELD": { $meta: "textScore"} } },
]);
Sie können den Text-Score auch in Prognoseausdrücken verwenden. Beispiel:
# Find search
db.cities
.find({ $text: { $search: "best french bread" } })
.project({ score: { $meta: "textScore" } })
# Aggregation search
db.cities.aggregate([
{ $match: { $text: { $search: "best french bread" } } },
{ $project: { "scoreField": { $meta: "textScore"} } },
]);
Suche ausweiten
Um die Relevanz der Ergebnisse der Textsuche zu verbessern, wird der Suchstring mit dem Operator $text entsprechend der angegebenen Sprache erweitert, um Übereinstimmungen für kontextbezogene Synonyme, Wortstammformen, Begriffe mit korrigierter Rechtschreibung, diakritische Varianten und mehr einzubeziehen.
Beschränkungen
$near-Operatoren und$text-Operatoren können nicht in derselben Textsuche verwendet werden.- Pro
find- oderaggregation-Suche ist nur ein$text-Operator zulässig. - Bei Aggregationen muss die
$match-Phase mit$textdie erste Pipelinephase sein. $textkann nur in$andund$orverschachtelt werden.- Wenn
$textin$orenthalten ist, können für die nicht suchbezogenen Disjunktionen vorhandene sortierte Indexe verwendet werden, um die Suche zu optimieren. Wenn die anderen Disjunktionen nicht indexiert sind, wird die Suche auf einem Sammlungsscan ausgeführt. $textkann nicht mit Hinweisen verwendet werden.- Abfragen mit Textsuche können nicht nach
$naturalsortiert werden.