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

Vytvořte vícejazyčný textový index v MongoDB

Když vytvoříte text index v MongoDB, index používá výchozí jazyk english .

Výchozí jazyk určuje pravidla pro analýzu kořenů slov (tj. odvození od kořenů) a ignorování zastavovacích slov.

V případě potřeby však můžete výchozí jazyk změnit.

Můžete také určit jazyk na úrovni dokumentu a dokonce i na úrovni vnořeného dokumentu. Výchozí jazyk bude použit pouze v případě, že jazyk nebyl zadán na úrovni dokumentu nebo vnořeného dokumentu.

Tento článek uvádí příklady určení jazyka pro text index.

Ukázková sbírka

Předpokládejme, že máme kolekci nazvanou sitcoms s dokumenty, jako je tento:

{
	"_id" : 1,
	"original_name" : "Family Guy",
	"translations" : {
		"language" : "german",
		"sitcom_name" : "Familienmensch"
	}
}
{
	"_id" : 2,
	"original_name" : "Cuéntame como pasó",
	"language" : "spanish",
	"translations" : [
		{
			"language" : "english",
			"sitcom_name" : "Tell me how it happened"
		},
		{
			"language" : "french",
			"sitcom_name" : "Raconte-moi comment cela s'est passé"
		}
	]
}

Vidíme, že v této sbírce jsou dva dokumenty. Každý dokument obsahuje název situační komedie spolu s překlady názvu této situační komedie do různých jazyků. Jazyk každého překladu je uveden v language pole příslušného vnořeného dokumentu.

Druhý dokument v této kolekci také obsahuje language pole na jeho nejvyšší úrovni (v tomto případě "language" : "spanish" ). To znamená, že název sitcomu je ve španělštině (nebo alespoň španělština je jazyk, který chceme používat, když je tento dokument indexován).

První dokument však takové pole neobsahuje. Skutečnost, že první dokument neobsahuje language nejvyšší úrovně pole znamená, že chceme, aby byl indexován pomocí výchozího jazyka. Pokud není během indexování zadán žádný výchozí jazyk, bude výchozím jazykem angličtina.

Pokud vložený dokument neobsahuje pole určující jazyk, použije se pole jazyka přiloženého dokumentu. Pokud přiložený dokument neobsahuje pole jazyka, použije se výchozí jazyk.

Vytvořte textový index pro více jazyků

Pojďme do toho a vytvořte text index pro výše uvedenou kolekci.

db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  }
)

Tím se vytvoří složený text index na original_name pole a translations.sitcom_name pole (tj. sitcom_name pole ve vložených dokumentech).

Nyní použijeme getIndexes() podívat se na ten index:

db.sitcoms.getIndexes()

Výsledek:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "original_name_text_translations.sitcom_name_text",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Vidíme, že používá výchozí jazyk angličtinu. Toto je specifikováno jako "default_language" : "english" .

Změnit výchozí jazyk

V případě potřeby můžeme při vytváření indexu nastavit jiný výchozí jazyk.

Pojďme index vypustit a znovu jej vytvořit s jiným výchozím jazykem:

db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish"
  }
)

Podívejme se na index:

db.sitcoms.getIndexes()

Výsledek:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "original_name_text_translations.sitcom_name_text",
		"default_language" : "danish",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Vidíme, že výchozí jazyk je nyní danish jak je uvedeno.

Přepis language_override Parametr

Možná se ptáte, „jak MongoDB věděl, že language dokumentu je pole je pole, které určuje jazyk?“.

A to je skvělá otázka. Ostatně, co kdybychom poli dali jiný název – jak by MongoDB věděl, že to je pole, které se má pro jazyk použít?

Pokud se podíváte na výše uvedený index, uvidíte, že má language_override pole. Konkrétně to vypadá takto:"language_override" : "language"

To znamená, že language dokumentu pole bude pole, které index používá k přepsání jazyka.

Když vytvoříte text index, bude index hledat všechna pole nazvaná language a poté je použijte jako jazyk pro příslušný dokument.

Název language není vytesán do kamene. Můžete to změnit, pokud si to přejete.

Předpokládejme, že naše sbírka obsahuje dokumenty, kde jsou názvy polí v dánštině.

Takhle:

{
	"_id" : 1,
	"originalt_navn" : "Family Guy",
	"sprog" : "english",
	"oversættelser" : {
		"sprog" : "german",
		"sitcom-navn" : "Familienmensch"
	}
}
{
	"_id" : 2,
	"originalt_navn" : "Cuéntame como pasó",
	"sprog" : "spanish",
	"oversættelser" : [
		{
			"sprog" : "english",
			"sitcom-navn" : "Tell me how it happened"
		},
		{
			"sprog" : "french",
			"sitcom-navn" : "Raconte-moi comment cela s'est passé"
		}
	]
}

V tomto případě sprog je pole, které určuje jazyk každého dokumentu.

Proto můžeme index vytvořit následovně:

db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish",
    "language_override": "sprog"
  }
)

Podívejme se na index:

db.sitcoms.getIndexes()

Výsledek:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "original_name_text_translations.sitcom_name_text",
		"default_language" : "danish",
		"language_override" : "sprog",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"textIndexVersion" : 3
	}
]

V našem nově vytvořeném text index, máme default_language jako danish a language_override pole jako sprog .

Dostupné jazyky

V době psaní tohoto článku existuje asi 15 jazyků, které podporuje text indexy a $text operátor.

Můžete použít dlouhý název jazyka (jako ve výše uvedených příkladech) nebo dvoupísmenný kód jazyka ISO 639-1.

Seznam jazyků textového vyhledávání je k dispozici na webu MongoDB.


  1. MongoDB + nodejs:jak se dotazovat na pole ISODate?

  2. MongoDb:Výhoda použití ObjectID oproti řetězci obsahujícímu Id?

  3. Aktualizujte pole v poli přesných prvků v MongoDB

  4. Import CSV pomocí schématu Mongoose