sql >> Databáze >  >> NoSQL >> MongoDB

Jak vytvořit textový index v MongoDB

V MongoDB můžete vytvořit různé typy indexů. Pokud máte pole, které obsahuje řetězec nebo pole řetězců, můžete použít text index v tomto poli.

Chcete-li vytvořit text index, použijte řetězcový doslovný "text" jako hodnotu při jeho vytváření.

Vytvoření textového indexu v jednom poli

Předpokládejme, že máme kolekci nazvanou posts a obsahuje dokumenty jako tento:

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

Možná budeme chtít vytvořit text index na body pole nebo abstract pole, nebo dokonce obojí.

Zde je návod, jak vytvořit text index na body pole:

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

Výstup:

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

Nyní můžeme použít getIndexes() metoda zobrazení indexu:

db.posts.getIndexes()

Výsledek:

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

Vidíme, že existují dva indexy. První z nich je výchozí _id index, který se vytváří automaticky s kolekcí. Druhý index je ten, který jsme právě vytvořili.

MongoDB automaticky přiřadil název našemu nově vytvořenému indexu. Jmenuje se body_text .

Vytvoření indexu složeného textu

Sbírka může mít pouze jeden text index, ale v případě potřeby to může být složený index.

Vytvořme složený index, který bude obsahovat body pole a abstract pole.

Jak již bylo zmíněno, kolekce může mít pouze jeden text index, takže vynecháme index, který jsme právě vytvořili:

db.posts.dropIndex("body_text")

Výstup:

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

Dobře, teď, když jsme vynechali text index, pojďme do toho a vytvořte další – tentokrát to bude složený index:

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

Výstup:

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

To je potvrzovací zpráva, která nám říká, že dříve existoval 1 index, ale nyní jsou 2.

Podívejme se znovu na seznam indexů:

db.posts.getIndexes()

Výsledek:

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

Všimněte si, že složený text indexy mají následující omezení:

  • Složený text index nemůže obsahovat žádné další speciální typy indexů, jako jsou víceklíčová nebo geoprostorová indexová pole.
  • Pokud je složený text index obsahuje klíče před text indexový klíč pro provedení $text vyhledávání, predikát dotazu musí zahrnovat podmínky shody na předchozích klíčích.
  • Při vytváření složeného text index, veškerý text klíče indexu musí být uvedeny vedle sebe v dokumentu specifikace indexu.

Vytvoření indexu zástupného textu

Zástupný textový index můžete vytvořit pomocí zástupného znaku $** vzor pole.

Vynecháme předchozí index a vytvoříme index zástupného textu:

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

MongoDB nám také poskytuje možnost vytvářet indexy zástupných znaků, nicméně indexy zástupných textů a indexy zástupných znaků jsou dvě odlišné věci.

Zejména indexy zástupných textů podporují $text operátor, zatímco indexy zástupných znaků nikoli.

weights Parametr

Při vytváření text indexy, máte možnost určit váhu pro jedno nebo více polí. Ve výchozím nastavení je každému poli přiřazena váha 1. Tuto hodnotu však můžete změnit a dát polím větší či menší váhu ve výsledcích vyhledávání.

Příklad

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

Začal jsem vypuštěním předchozího indexu.

Když jsem vytvořil nový text index, zadal jsem 3 pole. Když jsem specifikoval váhy, určil jsem váhy jen pro dvě z těchto polí.

Výsledkem je, že tato dvě pole budou mít váhu, jak je uvedeno, a druhé pole (title ) bude mít výchozí váhu 1.

Můžeme to vidět, když spustíme getIndexes() znovu:

db.posts.getIndexes()

Výsledek:

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

To znamená, že body pole bude mít dvakrát větší význam než abstract pole a desetkrát větší význam než title pole.

Vytváření vícejazyčných textových indexů

Všimnete si, že výše uvedený text index obsahuje "default_language" : "english" a "language_override" : "language" v jeho definici.

Tato pole pomáhají při práci s dokumenty ve více jazycích. Hodnoty ve výše uvedeném indexu jsou výchozí hodnoty.

Když vytváříte dokument, můžete určit jazyk tohoto dokumentu pomocí language pole (nebo jiné pole definované v language_override pole text index). Pokud takové pole v dokumentu neexistuje, použije výchozí jazyk uvedený v default_language pole.

Můžete zadat default_language (a language_override ), když vytváříte index.

Příklady vytváření textových indexů, které podporují více jazyků, najdete v části Vytvoření vícejazyčného textového indexu v MongoDB.


  1. Mongoengine:ConnectionError:Nedefinovali jste výchozí připojení

  2. Jak škálování skutečně funguje v Apache HBase

  3. Vytvořte jedinečné pole automatického přírůstku pomocí mangusty

  4. Vytváření ovladače mongo-cxx pomocí CMake ExternalProject_Add