MongoDB - wyszukiwanie tekstowe

Począwszy od wersji 2.4, MongoDB zaczął obsługiwać indeksy tekstowe do wyszukiwania w zawartości ciągu. PlikText Search wykorzystuje techniki odradzania do wyszukiwania określonych słów w polach ciągów poprzez upuszczanie słów stopujących, takich jak a, an, the, itd. Obecnie MongoDB obsługuje około 15 języków.

Włączanie wyszukiwania tekstowego

Początkowo wyszukiwanie tekstowe było funkcją eksperymentalną, ale począwszy od wersji 2.6 konfiguracja jest domyślnie włączona.

Tworzenie indeksu tekstowego

Rozważ następujący dokument w sekcji posts zbiór zawierający tekst postu i jego tagi -

> db.posts.insert({
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": ["mongodb", "tutorialspoint"]
}
{
	"post_text" : "writing tutorials on mongodb",
	"tags" : [ "mongodb", "tutorial" ]
})
WriteResult({ "nInserted" : 1 })

Stworzymy indeks tekstowy w polu post_text, abyśmy mogli przeszukiwać tekst naszych postów -

>db.posts.createIndex({post_text:"text"})
{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Korzystanie z indeksu tekstowego

Teraz, gdy utworzyliśmy indeks tekstowy w polu post_text, będziemy szukać wszystkich postów zawierających to słowo tutorialspoint w swoim tekście.

> db.posts.find({$text:{$search:"tutorialspoint"}}).pretty()
{
	"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}

Powyższe polecenie zwróciło następujące dokumenty wynikowe zawierające to słowo tutorialspoint w tekście postu -

{ 
   "_id" : ObjectId("53493d14d852429c10000002"), 
   "post_text" : "enjoy the mongodb articles on tutorialspoint", 
   "tags" : [ "mongodb", "tutorialspoint" ]
}

Usuwanie indeksu tekstowego

Aby usunąć istniejący indeks tekstowy, najpierw znajdź nazwę indeksu za pomocą następującego zapytania -

>db.posts.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "mydb.posts"
	},
	{
		"v" : 2,
		"key" : {
			"fts" : "text",
			"ftsx" : 1
		},
		"name" : "post_text_text",
		"ns" : "mydb.posts",
		"weights" : {
			"post_text" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]
>

Po uzyskaniu nazwy indeksu z powyższego zapytania, uruchom następujące polecenie. Tutaj,post_text_text to nazwa indeksu.

>db.posts.dropIndex("post_text_text")
{ "nIndexesWas" : 2, "ok" : 1 }