Textsuche mit Amazon DocumentDB durchführen - Amazon DocumentDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Textsuche mit Amazon DocumentDB durchführen

Mit der nativen Volltextsuchfunktion von Amazon DocumentDB können Sie mithilfe von speziellen Textindizes eine Textsuche in großen Textdatensätzen durchführen. Dieser Abschnitt beschreibt die Funktionen der Textindex-Funktion und enthält Schritte zur Erstellung und Verwendung von Textindizes in Amazon DocumentDB. Einschränkungen bei der Textsuche sind ebenfalls aufgeführt.

Unterstützte Funktionen

Die Amazon DocumentDB-Textsuche unterstützt die folgenden MongoDB-API-kompatiblen Funktionen:

  • Erstellen Sie Textindizes für ein einzelnes Feld.

  • Erstellen Sie zusammengesetzte Textindizes, die mehr als ein Textfeld enthalten.

  • Führen Sie Suchen mit einem Wort oder mehreren Wörtern durch.

  • Kontrollieren Sie die Suchergebnisse mithilfe von Gewichtungen.

  • Sortieren Sie die Suchergebnisse nach Punktzahl.

  • Verwenden Sie den Textindex in der Aggregationspipeline.

  • Suchen Sie nach einer exakten Phrase.

Um einen Textindex für ein Feld zu erstellen, das Zeichenkettendaten enthält, geben Sie die Zeichenfolge „Text“ wie unten dargestellt an:

Index für ein einzelnes Feld:

db.test.createIndex({"comments": "text"})

Dieser Index unterstützt Textsuchabfragen im Zeichenfolgenfeld „Kommentare“ in der angegebenen Sammlung.

Erstellen Sie einen zusammengesetzten Textindex für mehr als ein Zeichenkettenfeld:

db.test.createIndex({"comments": "text", "title":"text"})

Dieser Index unterstützt Textsuchabfragen in den Zeichenfolgenfeldern „Kommentare“ und „Titel“ in der angegebenen Sammlung. Sie können bis zu 30 Felder angeben, wenn Sie einen zusammengesetzten Textindex erstellen. Nach der Erstellung werden mit Ihren Textsuchabfragen alle indizierten Felder abgefragt.

Anmerkung

Für jede Sammlung ist nur ein Textindex zulässig.

Einen Textindex in einer Amazon DocumentDB-Sammlung auflisten

Sie können ihn für Ihre Sammlung verwendengetIndexes(), um Indizes, einschließlich Textindizes, zu identifizieren und zu beschreiben, wie im folgenden Beispiel gezeigt:

rs0:PRIMARY> db.test.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 1, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "contents_text", "ns" : "test.test", "default_language" : "english", "weights" : { "comments" : 1 }, "textIndexVersion" : 1 } ]

Sobald Sie einen Index erstellt haben, beginnen Sie mit dem Einfügen von Daten in Ihre Amazon DocumentDB-Sammlung.

db.test.insertMany([{"_id": 1, "star_rating": 4, "comments": "apple is red"}, {"_id": 2, "star_rating": 5, "comments": "pie is delicious"}, {"_id": 3, "star_rating": 3, "comments": "apples, oranges - healthy fruit"}, {"_id": 4, "star_rating": 2, "comments": "bake the apple pie in the oven"}, {"_id": 5, "star_rating": 5, "comments": "interesting couch"}, {"_id": 6, "star_rating": 5, "comments": "interested in couch for sale, year 2022"}])

Textsuchabfragen ausführen

Führen Sie eine Textsuchabfrage mit einem Wort aus

Sie müssen die $search Operatoren $text und verwenden, um Textsuchen durchzuführen. Im folgenden Beispiel werden alle Dokumente zurückgegeben, in denen Ihr indiziertes Textfeld die Zeichenfolge „apple“ oder „apple“ in anderen Formaten wie „apples“ enthält:

db.test.find({$text: {$search: "apple"}})

Ausgabe:

Die Ausgabe dieses Befehls sieht ungefähr so aus:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Führen Sie eine Textsuche mit mehreren Wörtern durch

Sie können auch Textsuchen mit mehreren Wörtern in Ihren Amazon DocumentDB DocumentDB-Daten durchführen. Der folgende Befehl gibt Dokumente zurück, deren indiziertes Textfeld „Apfel“ oder „Kuchen“ enthält:

db.test.find({$text: {$search: "apple pie"}})

Ausgabe:

Die Ausgabe dieses Befehls sieht ungefähr so aus:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Führen Sie eine Textsuche mit mehreren Wörtern durch

Verwenden Sie für eine Phrasensuche mit mehreren Wörtern dieses Beispiel:

db.test.find({$text: {$search: "\"apple pie\""}})

Ausgabe:

Der obige Befehl gibt Dokumente zurück, deren indiziertes Textfeld genau den Ausdruck „Apfelkuchen“ enthält. Die Ausgabe dieses Befehls sieht ungefähr so aus:

{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Führen Sie eine Textsuche mit Filtern aus

Sie können die Textsuche auch mit anderen Abfrageoperatoren kombinieren, um Ergebnisse nach zusätzlichen Kriterien zu filtern:

db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})

Ausgabe:

Der obige Befehl gibt Dokumente mit einem indizierten Textfeld zurück, das jede Form von „Interesse“ und ein „Star-Rating“ gleich 5 enthält. Die Ausgabe dieses Befehls sieht ungefähr so aus:

{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" } { "_id" : 6, "star_rating" : 5, "comments" : "interested in couch for sale, year 2022" }

Beschränken Sie die Anzahl der Dokumente, die bei einer Textsuche zurückgegeben werden

Sie können die Anzahl der zurückgegebenen Dokumente einschränken, indem Sie Folgendes verwendenlimit:

db.test.find({$and: [{star_rating: 5}, {$text: {$search: "couch"}}]}).limit(1)

Ausgabe:

Der obige Befehl gibt ein Ergebnis zurück, das dem Filter entspricht:

{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }

Sortiert die Ergebnisse nach der Textpunktzahl

Im folgenden Beispiel werden die Ergebnisse der Textsuche nach der Textpunktzahl sortiert:

db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})

Ausgabe:

Der obige Befehl gibt Dokumente zurück, deren indiziertes Textfeld „apple“ oder „apple“ in anderen Formaten wie „apples“ enthält, und sortiert das Ergebnis danach, wie relevant das Dokument für den Suchbegriff ist. Die Ausgabe dieses Befehls sieht ungefähr so aus:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red", "score" : 0.6079270860936958 } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit", "score" : 0.6079270860936958 } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven", "score" : 0.6079270860936958 }

$textund $search werden auch für delete Befehle aggregatecount,findAndModify,update, und unterstützt.

Aggregationsoperatoren

Aggregationspipeline mit $match

db.test.aggregate( [{ $match: { $text: { $search: "apple pie" } } }] )

Ausgabe:

Der obige Befehl gibt die folgenden Ergebnisse zurück:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 3, "star_rating" : 3, "comments" : "apple - a healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" } { "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }

Eine Kombination anderer Aggregationsoperatoren

db.test.aggregate( [ { $match: { $text: { $search: "apple pie" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { score: { $meta: "textScore" } } } ] )

Ausgabe:

Der obige Befehl gibt die folgenden Ergebnisse zurück:

{ "_id" : 4, "score" : 0.6079270860936958 } { "_id" : 1, "score" : 0.3039635430468479 } { "_id" : 2, "score" : 0.3039635430468479 } { "_id" : 3, "score" : 0.3039635430468479 }

Geben Sie mehrere Felder an, wenn Sie einen Textindex erstellen

Sie können bis zu drei Feldern in Ihrem Verbundtextindex Gewichtungen zuweisen. Die Standardgewichtung, die einem Feld in einem Textindex zugewiesen wird, ist eins (1). Das Gewicht ist ein optionaler Parameter und muss im Bereich von 1 bis 100.000 liegen.

db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )

Unterschiede zu MongoDB

Die Textindex-Funktion von Amazon DocumentDB verwendet einen umgekehrten Index mit einem Term-Frequenz-Algorithmus. Textindizes sind standardmäßig dünn gesät. Aufgrund von Unterschieden in der Parsing-Logik, Tokenisierungstrennzeichen und anderen kann es sein, dass dieselbe Ergebnismenge wie MongoDB nicht für denselben Datensatz oder dieselbe Abfrageform zurückgegeben wird.

Es bestehen die folgenden zusätzlichen Unterschiede zwischen dem Amazon DocumentDB-Textindex und MongoDB:

  • Zusammengesetzte Indizes, die Nicht-Text-Indizes verwenden, werden nicht unterstützt.

  • Amazon DocumentDB-Textindizes unterscheiden nicht zwischen Groß- und Kleinschreibung und diakritischen Zeichen.

  • Für den Textindex wird nur die englische Sprache unterstützt.

  • Die Textindizierung von Array-Feldern (oder Feldern mit mehreren Schlüsseln) wird nicht unterstützt. Wenn Sie beispielsweise einen Textindex für „a“ mit dem Dokument {„a“: [„apple“, „pie“]} erstellen, schlägt fehl.

  • Die Indexierung von Platzhaltertext wird nicht unterstützt.

  • Eindeutige Textindizes werden nicht unterstützt.

  • Das Ausschließen eines Begriffs wird nicht unterstützt.

Bewährte Verfahren und Richtlinien

  • Für eine optimale Leistung bei Textsuchabfragen, bei denen nach Textwerten sortiert wird, wird empfohlen, den Textindex vor dem Laden von Daten zu erstellen.

  • Textindizes benötigen zusätzlichen Speicherplatz für eine optimierte interne Kopie der indizierten Daten. Dies hat zusätzliche Kosten zur Folge.

Einschränkungen

Für die Textsuche gelten in Amazon DocumentDB die folgenden Einschränkungen:

  • Die Textsuche wird nur auf Amazon DocumentDB 5.0-Clustern auf Instanzbasis unterstützt.