MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Създайте многоезичен текстов индекс в MongoDB

Когато създавате text индекс в MongoDB, индексът използва език по подразбиране english .

Езикът по подразбиране определя правилата за анализиране на корените на думите (т.е. изходни) и игнориране на спиращите думи.

Можете обаче да промените езика по подразбиране, ако е необходимо.

Можете също да посочите език на ниво документ и дори на ниво поддокумент. Езикът по подразбиране ще се използва само ако език не е посочен на ниво документ или поддокумент.

Тази статия представя примери за определяне на език за text индекс.

Примерна колекция

Да предположим, че имаме колекция, наречена sitcoms с документи като този:

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

Виждаме, че в тази колекция има два документа. Всеки документ съдържа името на сериала, заедно с преводи на името на сериала на различни езици. Езикът на всеки превод е посочен на language поле на съответния поддокумент.

Вторият документ в тази колекция също включва language поле на най-горното му ниво (в този случай, "language" : "spanish" ). Това означава, че името на сериала е на испански (или поне испанският е езикът, който искаме да се използва, когато този документ е индексиран).

Първият документ обаче не съдържа такова поле. Фактът, че първият документ не съдържа language от най-високо ниво поле означава, че искаме то да бъде индексирано с езика по подразбиране. Ако не е посочен език по подразбиране по време на индексирането, тогава езикът по подразбиране ще бъде английски.

Ако вграден документ не съдържа поле, което посочва езика, тогава той ще използва езиковото поле на ограждащия документ. Ако ограждащият документ не съдържа поле за език, тогава той ще използва езика по подразбиране.

Създайте текстов индекс за няколко езика

Нека да продължим и да създадем text индекс за горната колекция.

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

Това създава съставен text индекс на original_name полето и translations.sitcom_name полето (т.е. sitcom_name поле във вградените документи).

Сега нека използваме getIndexes() за да разгледате този индекс:

db.sitcoms.getIndexes()

Резултат:

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

Можем да видим, че използва английски език по подразбиране. Това е посочено като "default_language" : "english" .

Промяна на езика по подразбиране

Можем да зададем различен език по подразбиране при създаване на индекса, ако е необходимо.

Нека пуснем индекса и да го създадем отново с различен език по подразбиране:

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

Нека да разгледаме индекса:

db.sitcoms.getIndexes()

Резултат:

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

Можем да видим, че езикът по подразбиране вече е danish както е посочено.

language_override Параметър

Може би се чудите „как MongoDB е знаел, че language на документа полето е полето, което определя езика?”.

И това е страхотен въпрос. В крайна сметка, какво ще стане, ако дадем на полето друго име – как MongoDB би знаел, че то полето за използване ли е за езика?

Ако погледнете горния индекс, ще видите, че има language_override поле. По-конкретно, това е така:"language_override" : "language"

Това означава, че language на документа полето ще бъде полето, което индексът използва за отмяна на езика.

Когато създавате text index, индексът ще търси полета, наречени language и след това ги използвайте като език за съответния документ.

Въпреки това, името language не е заложено в камък. Можете да го промените, ако желаете.

Да предположим, че нашата колекция съдържа документи, в които имената на полетата са на датски.

Като това:

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

В този случай sprog е полето, което определя езика на всеки документ.

Следователно можем да създадем индекса, както следва:

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

Нека проверим индекса:

db.sitcoms.getIndexes()

Резултат:

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

В нашия новосъздадения text индекс, имаме default_language като danish и language_override поле като sprog .

Налични езици

Към момента на писане има около 15 езика, които се поддържат от text индекси и $text оператор.

Можете да използвате името на езика с дълга форма (както в горните примери) или двубуквения код на езика ISO 639-1.

Списък с езици за текстово търсене е достъпен на уебсайта на MongoDB.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да инсталирате MongoDB

  2. MongoDB празни символи

  3. Mongoose Mongodb запитва масив от обекти

  4. Приложение, подобно на Twitter, използващо MongoDB

  5. Разбиране на ограничението за размера на документа на MongoDB BSON