Es gibt verschiedene Arten von Indizes, die Sie in MongoDB erstellen können. Wenn Sie ein Feld haben, das eine Zeichenfolge oder ein Array von Zeichenfolgen enthält, können Sie einen text
verwenden Index für dieses Feld.
Um einen text
zu erstellen index, verwenden Sie das Zeichenfolgenliteral "text"
als Wert beim Erstellen.
Erstellen Sie einen Textindex für ein einzelnes Feld
Angenommen, wir haben eine Sammlung namens posts
, und es enthält Dokumente wie diese:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Vielleicht möchten wir einen text
erstellen Index auf dem body
Feld oder die abstract
Feld oder sogar beides.
So erstellen Sie einen text
Index auf dem body
Feld:
db.posts.createIndex( { body : "text" } )
Ausgabe:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Wir können jetzt getIndexes()
verwenden Methode zum Anzeigen des Indexes:
db.posts.getIndexes()
Ergebnis:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Wir können sehen, dass es zwei Indizes gibt. Die erste ist die Standard-_id
Index, der automatisch mit der Sammlung erstellt wird. Der zweite Index ist der, den wir gerade erstellt haben.
MongoDB hat unserem neu erstellten Index automatisch einen Namen zugewiesen. Es heißt body_text
.
Erstellen Sie einen zusammengesetzten Textindex
Eine Sammlung kann nur einen text
haben index, kann aber bei Bedarf auch ein zusammengesetzter Index sein.
Lassen Sie uns einen zusammengesetzten Index erstellen, der den body
enthält Feld und die abstract
Feld.
Wie bereits erwähnt, kann eine Sammlung nur einen text
haben index, lassen Sie uns also den gerade erstellten Index löschen:
db.posts.dropIndex("body_text")
Ausgabe:
{ "nIndexesWas" : 2, "ok" : 1 }
OK, jetzt haben wir den text
gelöscht Index, lasst uns weitermachen und einen weiteren erstellen – dieses Mal wird es ein zusammengesetzter Index sein:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Ausgabe:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Das ist eine Bestätigungsnachricht, die uns mitteilt, dass es früher 1 Index gab, jetzt aber 2.
Sehen wir uns noch einmal die Liste der Indizes an:
db.posts.getIndexes()
Ergebnis:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Beachten Sie diesen zusammengesetzten text
Indizes haben die folgenden Einschränkungen:
- Ein zusammengesetzter
text
index kann keine anderen speziellen Indextypen enthalten, wie z. B. Multi-Key- oder Geodaten-Indexfelder. - Falls der zusammengesetzte
text
index enthält Schlüssel vor demtext
Indexschlüssel, um einen$text
auszuführen Suche muss das Abfrageprädikat Gleichheitsübereinstimmungsbedingungen für die vorhergehenden Schlüssel enthalten. - Beim Erstellen eines zusammengesetzten
text
Index, der gesamtetext
Indexschlüssel müssen nebenstehend im Indexspezifikationsdokument aufgeführt werden.
Erstellen Sie einen Platzhalter-Textindex
Sie können einen Platzhalter-Textindex erstellen, indem Sie den Platzhalter $**
verwenden Feldmuster.
Lassen Sie uns den vorherigen Index löschen und einen Platzhalter-Textindex erstellen:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB bietet uns auch die Möglichkeit, Wildcard-Indizes zu erstellen, jedoch sind Wildcard-Textindizes und Wildcard-Indizes zwei unterschiedliche Dinge.
Insbesondere Wildcard-Textindizes unterstützen den $text
-Operator, während Wildcard-Indizes dies nicht tun.
Die weights
Parameter
Beim Erstellen von text
Indizes haben Sie die Möglichkeit, für ein oder mehrere Felder eine Gewichtung anzugeben. Standardmäßig erhält jedes Feld eine Gewichtung von 1. Sie können dies jedoch ändern, um Felder in den Suchergebnissen mehr oder weniger zu gewichten.
Beispiel
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Ich begann damit, den vorherigen Index zu löschen.
Als ich den neuen text
erstellt habe index, ich habe 3 Felder angegeben. Als ich die Gewichtungen angegeben habe, habe ich Gewichtungen für nur zwei dieser Felder angegeben.
Das Ergebnis ist, dass diese beiden Felder wie angegeben gewichtet werden und das andere Feld (title
) hat die Standardgewichtung 1.
Wir können dies sehen, wenn wir getIndexes()
ausführen nochmal:
db.posts.getIndexes()
Ergebnis:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "title_text_body_text_abstract_text", "weights" : { "abstract" : 5, "body" : 10, "title" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Das bedeutet, dass der body
Das Feld hat die doppelte Bedeutung des abstract
Feld und die zehnfache Bedeutung des title
Feld.
Mehrsprachige Textindizes erstellen
Sie werden feststellen, dass der obige text
index enthält "default_language" : "english"
und "language_override" : "language"
in seiner Definition.
Diese Felder helfen beim Umgang mit Dokumenten in mehreren Sprachen. Die Werte im obigen Index sind die Standardwerte.
Wenn Sie ein Dokument erstellen, können Sie die Sprache dieses Dokuments angeben, indem Sie language
verwenden Feld (oder ein anderes Feld, das in language_override
definiert ist Feld des text
Index). Wenn ein solches Feld im Dokument nicht vorhanden ist, wird die in default_language
angegebene Standardsprache verwendet Feld.
Sie können eine default_language
angeben (und language_override
), wenn Sie den Index erstellen.
Beispiele für die Erstellung von Textindizes, die mehrere Sprachen unterstützen, finden Sie unter Erstellen eines mehrsprachigen Textindex in MongoDB.