MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Utwórz indeks tekstowy z różnymi wagami pól w MongoDB

Kiedy tworzysz text indeksu w MongoDB, masz możliwość zastosowania różnych wag do każdego indeksowanego pola.

Wagi te oznaczają względne znaczenie indeksowanych pól względem siebie. Pole o wyższej wadze będzie miało większy wpływ na wyniki wyszukiwania niż pole o mniejszej wadze.

Zapewnia to pewną kontrolę nad sposobem obliczania wyników wyszukiwania.

Domyślna waga to 1, więc jeśli nie określisz wagi dla pola, zostanie mu przypisana waga 1.

Przykład

Załóżmy, że mamy kolekcję o nazwie posts i zawiera takie dokumenty:

{
	"_id" : 1,
	"title" : "The Web",
	"body" : "Body text...",
	"abstract" : "Abstract text..."
}

Moglibyśmy stworzyć złożony text indeksuj do trzech pól tekstowych i stosuj różne wagi do każdego z nich.

Tak:

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

Kiedy utworzyłem złożony text indeks, określiłem 3 pola. Kiedy określiłem wagi, określiłem wagi tylko dla dwóch z tych pól.

W rezultacie te dwa pola będą ważone zgodnie ze specyfikacją, a drugie pole (title ) będzie miał domyślną wagę 1.

Możemy to zobaczyć, gdy uruchamiamy getIndexes() :

db.posts.getIndexes()

Wynik:

[
	{
		"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
	}
]

Oznacza to, że body pole będzie miało dwa razy większe znaczenie niż abstract i dziesięć razy większe znaczenie niż title pole.

Indeksy tekstu wieloznacznego z polami ważonymi

Wagi można stosować podczas tworzenia indeksów tekstu wieloznacznego. Indeksy tekstu wieloznacznego mogą być przydatne, gdy nie wiesz, jakie pola tekstowe będą znajdować się w dokumentach. Możesz znać niektóre , ale nie wszystkie.

W takich przypadkach możesz utworzyć indeks tekstowy z symbolami wieloznacznymi i przypisać wagę do tych pól, o których wiesz. Do wszystkich pozostałych pól zostanie przypisana domyślna wartość 1.

Załóżmy, że mamy następujący dokument jako wytyczne:

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

Jest podobny do poprzedniego dokumentu, z tą różnicą, że ma teraz tags pole zawierające tablicę. Ale z tego, co wiemy, przyszłe dokumenty w tej kolekcji mogą mieć inne pola – na przykład categories , keywords , author_bio itp.

Ale tak naprawdę nie wiemy, więc utworzymy indeks tekstowy z symbolami wieloznacznymi, który hermetyzuje wszystkie pola danymi ciągów. Stworzymy wagi dla niektórych znanych pól.

Przykład:

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

W tym przypadku body pole otrzymuje wagę 10 i abstract pole otrzymuje wagę 5 . Oznacza to, że body pole ma dwukrotnie większy wpływ niż pole abstrakcyjne i dziesięciokrotnie większy wpływ wszystkich innych pól tekstowych (ponieważ zostanie im przypisana domyślna waga 1).

Po utworzeniu tego indeksu, jeśli wywołamy getIndexes() , możemy zobaczyć wagi przypisane do pól:

db.posts.getIndexes()

Wynik:

[
	{
		"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
	}
]

Zgodnie z oczekiwaniami body pole otrzymuje 10 , abstract pole otrzymuje 5 , a wszyscy inni otrzymują 1 .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb, zapytanie zbiorcze z $lookup

  2. Jak migrować dane w MongoDB

  3. MongoDB grupuj według godziny

  4. Nie można znaleźć dokumentów przeszukujących według ObjectId przy użyciu Mongoose

  5. Zaokrąglanie do 2 miejsc po przecinku przy użyciu platformy agregacji MongoDB