sql >> Base de Datos >  >> NoSQL >> MongoDB

Cree un índice de texto en varios idiomas en MongoDB

Cuando creas un text index en MongoDB, el índice usa un idioma predeterminado de english .

El idioma predeterminado determina las reglas para analizar las raíces de las palabras (es decir, derivación) e ignorar las palabras vacías.

Sin embargo, puede cambiar el idioma predeterminado si es necesario.

También puede especificar un idioma a nivel de documento e incluso a nivel de subdocumento. El idioma predeterminado solo se utilizará si no se ha especificado un idioma en el nivel del documento o subdocumento.

Este artículo presenta ejemplos de cómo especificar un idioma para un text índice.

Colección de ejemplo

Supongamos que tenemos una colección llamada sitcoms con documentos como este:

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

Podemos ver que hay dos documentos en esta colección. Cada documento contiene el nombre de una comedia de situación, junto con las traducciones de ese nombre de comedia de situación en diferentes idiomas. El idioma de cada traducción se especifica en el language campo del subdocumento respectivo.

El segundo documento de esta colección también incluye un language campo en su nivel superior (en este caso, "language" : "spanish" ). Esto significa que el nombre de la sitcom está en español (o al menos, el español es el idioma que queremos que se use cuando se indexe este documento).

Sin embargo, el primer documento no contiene dicho campo. El hecho de que el primer documento no contenga un language de nivel superior campo significa que queremos que se indexe utilizando el idioma predeterminado. Si no se especifica un idioma predeterminado durante la indexación, el idioma predeterminado será el inglés.

Si un documento incrustado no contiene un campo que especifique el idioma, utilizará el campo de idioma del documento adjunto. Si el documento adjunto no contiene un campo de idioma, utilizará el idioma predeterminado.

Cree un índice de texto para varios idiomas

Avancemos y creemos un text índice de la colección anterior.

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

Eso crea un text compuesto índice en el original_name y el campo translations.sitcom_name (es decir, el campo sitcom_name campo en los documentos incrustados).

Ahora usemos getIndexes() para echar un vistazo a ese índice:

db.sitcoms.getIndexes()

Resultado:

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

Podemos ver que utiliza un idioma predeterminado de inglés. Esto se especifica como "default_language" : "english" .

Cambiar el idioma predeterminado

Podemos establecer un idioma predeterminado diferente al crear el índice si es necesario.

Descartemos el índice y volvamos a crearlo con un idioma predeterminado diferente:

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

Echemos un vistazo al índice:

db.sitcoms.getIndexes()

Resultado:

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

Podemos ver que el idioma predeterminado ahora es danish como se especifica.

El language_override Parámetro

Quizás se pregunte "¿cómo supo MongoDB que el language del documento ¿El campo es el campo que especifica el idioma?”.

Y esa es una gran pregunta. Después de todo, ¿qué pasaría si le hubiéramos dado al campo un nombre diferente? ¿Cómo sabría MongoDB que eso es el campo a utilizar para el idioma?

Si observa el índice anterior, verá que tiene un language_override campo. Específicamente, es así:"language_override" : "language"

Lo que eso significa es que el language del documento El campo será el campo que el índice usa para anular el idioma.

Cuando creas un text índice, el índice buscará cualquier campo llamado language y luego utilícelos como idioma para el documento respectivo.

Sin embargo, el nombre language no está escrito en piedra. Puedes cambiarlo si así lo deseas.

Supongamos que nuestra colección contiene documentos donde los nombres de los campos están en danés.

Así:

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

En este caso, sprog es el campo que determina el idioma de cada documento.

Por lo tanto, podemos crear el índice de la siguiente manera:

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

Revisemos el índice:

db.sitcoms.getIndexes()

Resultado:

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

En nuestro text recién creado índice, tenemos el default_language como danish y el language_override campo como sprog .

Idiomas disponibles

Al momento de escribir, hay alrededor de 15 idiomas compatibles con text índices y el $text operador.

Puede usar el nombre de idioma de forma larga (como en los ejemplos anteriores) o el código de idioma de dos letras ISO 639-1.

Una lista de idiomas de búsqueda de texto está disponible en el sitio web de MongoDB.