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 systemeigenen Volltextsuchfunktion von Amazon DocumentDB (Text Index v1) können Sie mithilfe spezieller Textindizes eine Textsuche in großen Textdatensätzen durchführen. Dieser Abschnitt beschreibt die Funktionen der Textindexfunktion und enthält Schritte zur Erstellung und Verwendung von Textindizes in Amazon DocumentDB. Einschränkungen bei der Textsuche sind ebenfalls aufgeführt.
Topics
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 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.
Verwenden Sie den Amazon DocumentDB-Textindex
Um einen Textindex für ein Feld zu erstellen, das Zeichenkettendaten enthält, geben Sie die Zeichenfolge „Text“ wie unten gezeigt an:
Einzelfeldindex:
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 Zeichenfolgenfeld:
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 Index für zusammengesetzten Text erstellen. Nach der Erstellung fragen Ihre Textsuchabfragen alle indizierten Felder ab.
Anmerkung
Für jede Sammlung ist nur ein Textindex zulässig.
Einen Textindex in einer Amazon DocumentDB-Sammlung auflisten
Sie können es in Ihrer 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"}])
Ausführen von Textsuchabfragen
Führen Sie eine Textsuchabfrage mit einem Wort aus
Sie müssen die $search Operatoren $text und verwenden, um eine Textsuche durchzuführen. Im folgenden Beispiel werden alle Dokumente zurückgegeben, in denen Ihr textindiziertes Feld 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 eine Textsuche mit mehreren Wörtern in Ihren Amazon DocumentDB-Daten durchführen. Der folgende Befehl gibt Dokumente mit einem textindizierten Feld zurück, das „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 mit einem textindizierten Feld zurück, das den exakten 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 durch
Sie können die Textsuche auch mit anderen Abfrageoperatoren kombinieren, um Ergebnisse anhand zusätzlicher Kriterien zu filtern:
db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})
Ausgabe:
Der obige Befehl gibt Dokumente mit einem textindizierten Feld zurück, das eine beliebige Form von „Zinsen“ enthält und deren „star_rating“ dem Wert 5 entspricht. 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" }
Begrenzen 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 den Filter erfüllt:
{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }
Sortiert die Ergebnisse nach Textnote
Im folgenden Beispiel werden die Ergebnisse der Textsuche nach dem Textwert sortiert:
db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})
Ausgabe:
Der obige Befehl gibt Dokumente mit einem textindizierten Feld zurück, das „Apfel“ oder „Apfel“ in seinen anderen Formaten wie „Äpfel“ enthält, und sortiert das Ergebnis danach, wie relevant das Dokument mit dem Suchbegriff zusammenhängt. 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, findAndModifyupdate, und unterstützt.
Operatoren für Aggregation
Aggregationspipeline unter Verwendung $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" : "apples, oranges - 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 zusammengesetzten Textindex Gewichtungen zuweisen. Die Standardgewichtung, die einem Feld in einem Textindex zugewiesen wird, ist eins (1). Die Gewichtung ist ein optionaler Parameter und muss im Bereich von 1 bis 100000 liegen.
db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )
Unterschiede zu MongoDB
Die Textindexfunktion von Amazon DocumentDB verwendet einen invertierten Index mit einem Begriffshäufigkeitsalgorithmus. Textindizes sind standardmäßig spärlich. Aufgrund von Unterschieden in der Analyselogik, Tokenisierungstrennzeichen usw. wird möglicherweise nicht dieselbe Ergebnismenge wie MongoDB für denselben Datensatz oder dieselbe Abfrageform zurückgegeben.
Die folgenden zusätzlichen Unterschiede zwischen dem Amazon DocumentDB-Textindex und MongoDB bestehen:
Zusammengesetzte Indizes, die keine Textindizes verwenden, werden nicht unterstützt.
Amazon DocumentDB-Textindizes unterscheiden nicht zwischen Groß- und Kleinschreibung.
Nur die englische Sprache wird mit dem Textindex unterstützt.
Die Textindizierung von Array-Feldern (oder Feldern mit mehreren Schlüsseln) wird nicht unterstützt. Beispielsweise schlägt das Erstellen eines Textindexes für „a“ mit dem Dokument {„a“: [„apple“, „pie“]} fehl.
Die Platzhalter-Textindizierung 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, erstellen Sie den Textindex, bevor Sie Daten laden.
Textindizes benötigen zusätzlichen Speicherplatz für eine optimierte interne Kopie der indizierten Daten. Dies hat zusätzliche Auswirkungen auf die Kosten.
Textindex V2
Amazon DocumentDB 8.0 führt eine neue Version des Textindex (V2) ein, die den zugrunde liegenden Textsuchparser ändert, um mehr Kompatibilität mit der MongoDB zu gewährleisten.
Zusätzlich zu den Funktionen, die von den V1-Textindizes bereitgestellt werden, bieten V2-Textindizes auch die folgende Unterstützung:
Der Planer verschiebt $match-Phasen, wenn möglich, früher in der Pipeline und reduziert so die Anzahl der Dokumente, die in den nachfolgenden Phasen verarbeitet werden.
Verbesserte Tokenisierung von Sonderzeichen in Textfeldern wie E-Mails, URLs und Dateipfaden. V2 kann einzelne Token innerhalb dieser Zeichenketten analysieren und abgleichen, während V1 dies nicht konnte.
rs0:PRIMARY> db.coll.createIndex({ "a": "text" }); rs0:PRIMARY> db.coll.find() { "_id" : 1, "a" : "jane.doe_1234@company.com" } { "_id" : 2, "a" : "janedoe@company.com" } { "_id" : 3, "a" : "/home/user/company/thesis.pdf" } { "_id" : 4, "a" : "/home/user/path/jane.pdf" } { "_id" : 5, "a" : "http://www.company.com/path" } { "_id" : 6, "a" : "https://company.com/path/../home" } // Sample query rs0:PRIMARY> db.coll.find({ $text: { $search: "jane" } }); // V1 text index — no results None // V2 text index — matches tokens within emails and file paths { "_id" : 1, "a" : "jane.doe_1234@company.com" } { "_id" : 4, "a" : "/home/user/path/jane.pdf" }
Einschränkungen
Die Textsuche hat in Amazon DocumentDB die folgenden Einschränkungen:
Textindizes speichern Lexeme und ihre Positionsinformationen. Die Gesamtgröße aller Lexeme und ihrer Positionsinformationen in einem einzigen Dokument ist auf 1 MB begrenzt.