MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So erstellen Sie einen Textindex in MongoDB

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 dem text 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 gesamte text 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.