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.