MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Créer un index de texte multilingue dans MongoDB

Lorsque vous créez un text index dans MongoDB, l'index utilise une langue par défaut de english .

La langue par défaut détermine les règles pour analyser les racines des mots (c'est-à-dire les radicaux) et ignorer les mots vides.

Cependant, vous pouvez modifier la langue par défaut si nécessaire.

Vous pouvez également spécifier une langue au niveau du document, et même au niveau du sous-document. La langue par défaut ne sera utilisée que si aucune langue n'a été spécifiée au niveau du document ou du sous-document.

Cet article présente des exemples de spécification d'une langue pour un text indice.

Exemple de collecte

Supposons que nous ayons une collection appelée sitcoms avec des documents comme celui-ci :

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

Nous pouvons voir qu'il y a deux documents dans cette collection. Chaque document contient le nom d'une sitcom, ainsi que des traductions de ce nom de sitcom dans différentes langues. La langue de chaque traduction est spécifiée dans le language champ du sous-document respectif.

Le deuxième document de cette collection comprend également un language champ à son niveau supérieur (dans ce cas, "language" : "spanish" ). Cela signifie que le nom de la sitcom est en espagnol (ou du moins, l'espagnol est la langue que nous souhaitons utiliser lors de l'indexation de ce document).

Cependant, le premier document ne contient pas un tel champ. Le fait que le premier document ne contienne pas de language de niveau supérieur champ signifie que nous voulons qu'il soit indexé en utilisant la langue par défaut. Si aucune langue par défaut n'est spécifiée lors de l'indexation, la langue par défaut sera l'anglais.

Si un document intégré ne contient pas de champ spécifiant la langue, il utilisera le champ de langue du document joint. Si le document joint ne contient pas de champ de langue, il utilisera la langue par défaut.

Créer un index de texte pour plusieurs langues

Continuons et créons un text index pour la collection ci-dessus.

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

Cela crée un text composé index sur le original_name et le champ translations.sitcom_name champ (c'est-à-dire le sitcom_name dans les documents intégrés).

Utilisons maintenant getIndexes() pour jeter un œil à cet index :

db.sitcoms.getIndexes()

Résultat :

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

Nous pouvons voir qu'il utilise une langue par défaut de l'anglais. Ceci est spécifié comme "default_language" : "english" .

Modifier la langue par défaut

Nous pouvons définir une langue par défaut différente lors de la création de l'index si nécessaire.

Laissons tomber l'index et recréons-le avec une autre langue par défaut :

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

Jetons un coup d'œil à l'index :

db.sitcoms.getIndexes()

Résultat :

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

Nous pouvons voir que la langue par défaut est maintenant danish comme spécifié.

Le language_override Paramètre

Vous vous demandez peut-être "comment MongoDB a-t-il su que la language du document champ est le champ qui spécifie la langue ?".

Et c'est une excellente question. Après tout, que se passerait-il si nous avions donné au champ un nom différent - comment MongoDB saurait-il que il est le champ à utiliser pour la langue ?

Si vous regardez l'index ci-dessus, vous verrez qu'il a un language_override domaine. Plus précisément, cela se passe comme suit :"language_override" : "language"

Cela signifie que la language du document field sera le champ que l'index utilise pour remplacer la langue.

Lorsque vous créez un text index, l'index recherchera tous les champs appelés language puis utilisez-les comme langue pour le document respectif.

Cependant, le nom language n'est pas figé. Vous pouvez le changer si vous le désirez.

Supposons que notre collection contienne des documents dont les noms de champs sont en danois.

Comme ceci :

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

Dans ce cas, sprog est le champ qui détermine la langue de chaque document.

Par conséquent, nous pouvons créer l'index comme suit :

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

Vérifions l'index :

db.sitcoms.getIndexes()

Résultat :

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

Dans notre nouveau text index, nous avons le default_language comme danish , et le language_override champ comme sprog .

Langues disponibles

Au moment de la rédaction, environ 15 langues sont prises en charge par text index et le $text opérateur.

Vous pouvez utiliser le nom de langue long (comme dans les exemples ci-dessus) ou le code de langue ISO 639-1 à deux lettres.

Une liste des langues de recherche de texte est disponible sur le site Web de MongoDB.