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

Erstellen Sie einen Wildcard-Textindex in MongoDB

MongoDB bietet uns die Möglichkeit, Wildcard-Textindizes zu erstellen.

Wildcard-Textindizes ähneln Wildcard-Indizes, außer dass Wildcard-Textindizes den $text unterstützen -Operator, während Wildcard-Indizes dies nicht tun.

Allerdings ist das Erstellen der einzelnen Indextypen insofern sehr ähnlich, als sie beide den Platzhalter $** teilen Feldmuster.

Beispiel

Angenommen, wir haben eine Sammlung namens posts , und es enthält Dokumente, die so aussehen:

{
	"_id" : 1,
	"title" : "Title text...",
	"body" : "Body text...",
	"abstract" : "Abstract text...",
	"tags" : [
		"tag1",
		"tag2",
		"tag3"
	]
}

Wir könnten einen Wildcard-Textindex für diese Sammlung wie folgt erstellen:

db.posts.createIndex( { "$**": "text" } )

Ausgabe:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Dabei wird der Platzhalter $** verwendet Feldmuster, um einen Index für alle Textfelder zu erstellen. Wenn Sie einen solchen Index erstellen, indiziert MongoDB jedes Feld, das Zeichenfolgendaten für jedes Dokument in der Sammlung enthält.

Dies kann nützlich sein, wenn die Sammlung viele unstrukturierte Inhalte enthält und die Textfelder in den Dokumenten nicht konsistent sind. In solchen Fällen könnten Sie die Felder nicht explizit in den Index aufnehmen, da Sie nicht wissen würden, welche Felder in den Dokumenten enthalten sein werden.

Gewichtete Felder

Sie können die weights verwenden Parameter, um den Feldern in einem Wildcard-Textindex unterschiedliche Gewichtungen zuzuweisen.

Beispiel:

db.posts.createIndex( 
  { "$**": "text" },
  { weights: {
      body: 10,
      abstract: 5
    } 
  } 
)

Ausgabe:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

In diesem Fall der body -Feld erhält eine Gewichtung von 10 und die abstract Feld erhält eine Gewichtung von 5 . Das bedeutet, dass der body -Feld hat die doppelte Auswirkung des abstrakten Felds und die zehnfache Auswirkung aller anderen Textfelder (weil ihnen die Standardgewichtung 1 zugewiesen wird).

Nachdem wir diesen Index erstellt haben, rufen wir getIndexes() auf Um alle Indizes für die Sammlung zurückzugeben, können wir die Gewichtungen der Felder sehen:

db.posts.getIndexes()

Ergebnis:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "$**_text",
		"weights" : {
			"$**" : 1,
			"abstract" : 5,
			"body" : 10
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Wie erwartet, der body Feld bekommt 10 , die abstract Feld bekommt 5 , und alle anderen erhalten 1 .