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

Erstellen Sie einen Textindex mit unterschiedlichen Feldgewichtungen in MongoDB

Wenn Sie einen text erstellen index in MongoDB haben Sie die Möglichkeit, jedem indizierten Feld unterschiedliche Gewichtungen zuzuweisen.

Diese Gewichtungen geben die relative Bedeutung der indizierten Felder zueinander an. Ein Feld mit einer höheren Gewichtung wirkt sich stärker auf die Suchergebnisse aus als ein Feld mit einer niedrigeren Gewichtung.

Dadurch haben Sie eine gewisse Kontrolle darüber, wie die Suchergebnisse berechnet werden.

Die Standardgewichtung ist 1. Wenn Sie also keine Gewichtung für das Feld angeben, wird ihm eine Gewichtung von 1 zugewiesen.

Beispiel

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..."
}

Wir könnten einen zusammengesetzten text erstellen indexieren Sie die drei Textfelder und wenden Sie unterschiedliche Gewichtungen auf diese an.

So:

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

Als ich den zusammengesetzten 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 :

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.

Platzhalter-Textindizes mit gewichteten Feldern

Beim Erstellen von Platzhalter-Textindizes können Sie Gewichtungen anwenden. Platzhalter-Textindizes können praktisch sein, wenn Sie nicht wissen, welche Textfelder in den Dokumenten enthalten sein werden. Vielleicht kennen Sie einige , aber nicht alle.

In solchen Fällen könnten Sie einen Platzhalter-Textindex erstellen und den Ihnen bekannten Feldern eine Gewichtung zuweisen. Allen anderen Feldern wird der Standardwert 1 zugewiesen.

Angenommen, wir haben das folgende Dokument als Richtlinie:

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

Es ähnelt dem vorherigen Dokument, außer dass es jetzt tags hat Feld, das ein Array enthält. Aber soweit wir wissen, könnten zukünftige Dokumente in dieser Sammlung andere Felder haben – wie vielleicht categories , keywords , author_bio usw.

Aber wir wissen es nicht genau, also erstellen wir einen Platzhalter-Textindex, der alle Felder mit Zeichenfolgendaten kapselt. Und wir werden Gewichtungen für einige der bekannten Felder erstellen.

Beispiel:

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

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 , können wir die den Feldern zugewiesene Gewichtung 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 .