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

Jak utworzyć indeks tekstowy w MongoDB

W MongoDB można tworzyć różne rodzaje indeksów. Jeśli masz pole zawierające ciąg lub tablicę ciągów, możesz użyć text indeks w tym polu.

Aby utworzyć text indeks, użyj literału ciągu "text" jako wartość podczas jej tworzenia.

Utwórz indeks tekstowy w jednym polu

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

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

Możemy chcieć utworzyć text indeks w body pole lub abstract pole, a nawet jedno i drugie.

Oto jak utworzyć text indeks w body pole:

db.posts.createIndex( { body : "text" } )

Wyjście:

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

Możemy teraz użyć getIndexes() metoda przeglądania indeksu:

db.posts.getIndexes()

Wynik:

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

Widzimy, że istnieją dwa indeksy. Pierwszy to domyślny _id indeks tworzony automatycznie z kolekcją. Drugi indeks to ten, który właśnie utworzyliśmy.

MongoDB automatycznie przypisał nazwę do naszego nowo utworzonego indeksu. Nazywa się body_text .

Utwórz złożony indeks tekstowy

Kolekcja może mieć tylko jeden text indeks, ale w razie potrzeby może to być indeks złożony.

Utwórzmy indeks złożony, który zawiera body pole i abstract pole.

Jak wspomniano, kolekcja może mieć tylko jeden text indeks, więc odrzućmy indeks, który właśnie stworzyliśmy:

db.posts.dropIndex("body_text")

Wyjście:

{ "nIndexesWas" : 2, "ok" : 1 }

OK, teraz porzuciliśmy text indeks, chodźmy dalej i stwórzmy kolejny – tym razem będzie to indeks złożony:

db.posts.createIndex( { 
  body : "text",
  abstract : "text"
} )

Wyjście:

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

To komunikat potwierdzający, który mówi nam, że kiedyś był 1 indeks, ale teraz jest 2.

Sprawdźmy jeszcze raz listę indeksów:

db.posts.getIndexes()

Wynik:

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

Zwróć uwagę, że złożony text indeksy mają następujące ograniczenia:

  • Złożony text indeks nie może zawierać żadnych innych specjalnych typów indeksów, takich jak wielokluczowe lub geoprzestrzenne pola indeksowe.
  • Jeśli złożony text indeks zawiera klucze poprzedzające text klawisz indeksu, aby wykonać $text wyszukiwania, predykat zapytania musi zawierać warunki dopasowania równości w poprzednich kluczach.
  • Podczas tworzenia złożonego text indeks, cały text klucze indeksu muszą być wymienione obok w dokumencie specyfikacji indeksu.

Utwórz indeks tekstowy z symbolami zastępczymi

Możesz utworzyć indeks tekstowy z symbolami wieloznacznymi, używając symbolu wieloznacznego $** wzór pola.

Porzućmy poprzedni indeks i utwórzmy indeks tekstowy z symbolami wieloznacznymi:

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

MongoDB zapewnia nam również możliwość tworzenia indeksów z symbolami wieloznacznymi, jednak indeksy tekstowe z symbolami wieloznacznymi i indeksy z symbolami wieloznacznymi to dwie różne rzeczy.

W szczególności indeksy tekstowe z symbolami wieloznacznymi obsługują $text operator, podczas gdy indeksy wieloznaczne nie.

weights Parametr

Podczas tworzenia text indeksów, masz możliwość określenia wagi w jednym lub kilku polach. Domyślnie każdemu polu przypisywana jest waga 1. Można to jednak zmienić, aby nadać polom większą lub mniejszą wagę w wynikach wyszukiwania.

Przykład

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

Zacząłem od upuszczenia poprzedniego indeksu.

Kiedy utworzyłem nowy 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() ponownie:

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.

Tworzenie indeksów tekstowych w wielu językach

Zauważysz, że powyższy text indeks zawiera "default_language" : "english" i "language_override" : "language" w swojej definicji.

Te pola pomagają w radzeniu sobie z dokumentami w wielu językach. Wartości w powyższym indeksie są wartościami domyślnymi.

Kiedy tworzysz dokument, możesz określić język tego dokumentu, używając language pole (lub inne pole zdefiniowane w language_override pole text indeks). Jeśli takie pole nie istnieje w dokumencie, użyje domyślnego języka określonego w default_language pole.

Możesz określić default_language (i language_override ) podczas tworzenia indeksu.

Zobacz Tworzenie wielojęzycznego indeksu tekstowego w MongoDB, aby zapoznać się z przykładami tworzenia indeksów tekstowych obsługujących wiele języków.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoid Group By lub MongoDb group by w szynach

  2. Wykonywanie Mongo jak Query (JSON) przez Javę

  3. Mongodb, sprawdź, czy kolekcja jest pusta, node.js

  4. Mongoose findOneAndUpdate i runValidators nie działają

  5. Czy istnieje konwencja nazywania kolekcji w MongoDB?