sql >> Database >  >> NoSQL >> MongoDB

Maak een meertalige tekstindex in MongoDB

Wanneer u een text maakt index in MongoDB, de index gebruikt een standaardtaal english .

De standaardtaal bepaalt de regels voor het ontleden van woordwortels (d.w.z. stammen) en het negeren van stopwoorden.

U kunt desgewenst echter de standaardtaal wijzigen.

U kunt ook een taal specificeren op documentniveau, en zelfs op subdocumentniveau. De standaardtaal wordt alleen gebruikt als er geen taal is opgegeven op document- of subdocumentniveau.

Dit artikel geeft voorbeelden van het specificeren van een taal voor een text index.

Voorbeeldverzameling

Stel dat we een verzameling hebben met de naam sitcoms met documenten zoals deze:

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

We kunnen zien dat er twee documenten in deze collectie zijn. Elk document bevat de naam van een sitcom, samen met vertalingen van die sitcom-naam in verschillende talen. De taal van elke vertaling wordt gespecificeerd in de language veld van het respectievelijke subdocument.

Het tweede document in deze collectie bevat ook een language veld op het hoogste niveau (in dit geval "language" : "spanish" ). Dit betekent dat de naam van de sitcom in het Spaans is (of in ieder geval Spaans is de taal die we willen gebruiken wanneer dit document wordt geïndexeerd).

Het eerste document bevat echter niet zo'n veld. Het feit dat het eerste document geen language op het hoogste niveau bevat veld betekent dat we willen dat het wordt geïndexeerd met de standaardtaal. Als er geen standaardtaal is opgegeven tijdens het indexeren, dan is de standaardtaal Engels.

Als een ingesloten document geen veld bevat waarin de taal wordt gespecificeerd, wordt het taalveld van het bijgevoegde document gebruikt. Als het bijgevoegde document geen taalveld bevat, wordt de standaardtaal gebruikt.

Een tekstindex maken voor meerdere talen

Laten we doorgaan en een text maken index voor de bovenstaande verzameling.

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

Dat creëert een samengestelde text index op de original_name veld, en de translations.sitcom_name veld (d.w.z. de sitcom_name veld in de ingesloten documenten).

Laten we nu getIndexes() . gebruiken om die index te bekijken:

db.sitcoms.getIndexes()

Resultaat:

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

We kunnen zien dat het een standaardtaal Engels gebruikt. Dit wordt gespecificeerd als "default_language" : "english" .

De standaardtaal wijzigen

We kunnen indien nodig een andere standaardtaal instellen bij het maken van de index.

Laten we de index verwijderen en opnieuw maken met een andere standaardtaal:

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

Laten we eens naar de index kijken:

db.sitcoms.getIndexes()

Resultaat:

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

We kunnen zien dat de standaardtaal nu danish is zoals gespecificeerd.

De language_override Parameter

Je vraagt ​​je misschien af ​​"hoe wist MongoDB dat de language van het document" veld is het veld dat de taal specificeert?”.

En dat is een geweldige vraag. Immers, wat als we het veld een andere naam hadden gegeven - hoe zou MongoDB weten dat het is het veld dat voor de taal moet worden gebruikt?

Als u naar de bovenstaande index kijkt, ziet u dat deze een language_override . heeft veld. Concreet gaat het als volgt:"language_override" : "language"

Dat betekent dat de language . van het document veld is het veld dat de index gebruikt om de taal te overschrijven.

Wanneer u een text maakt index, zoekt de index naar velden met de naam language en gebruik die dan als de taal voor het betreffende document.

Echter, de naam language staat niet in steen gebeiteld. Je kunt het veranderen als je dat wilt.

Stel dat onze collectie documenten bevat waarvan de veldnamen in het Deens zijn.

Zoals dit:

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

In dit geval sprog is het veld dat de taal van elk document bepaalt.

Daarom kunnen we de index als volgt maken:

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

Laten we de index eens bekijken:

db.sitcoms.getIndexes()

Resultaat:

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

In onze nieuw gemaakte text index, we hebben de default_language als danish , en de language_override veld als sprog .

Beschikbare talen

Op het moment van schrijven zijn er ongeveer 15 talen die worden ondersteund door text indexen en de $text telefoniste.

U kunt de lange taalnaam gebruiken (zoals in de bovenstaande voorbeelden) of de tweeletterige ISO 639-1-taalcode.

Een lijst met tekstzoektalen is beschikbaar op de MongoDB-website.


  1. De meest efficiënte manier om meerdere hashes in Redis te krijgen?

  2. MongoDB:Hoe werk ik een enkel subelement in een array bij, waarnaar wordt verwezen door de index in de array?

  3. MongoDB-witruimtetekens

  4. Basisoverwegingen voor het nemen van een MongoDB-back-up