Hay varios tipos de índices que puede crear en MongoDB. Si tiene un campo que contiene una cadena o una matriz de cadenas, puede usar un text
índice en ese campo.
Para crear un text
índice, use el literal de cadena "text"
como el valor al crearlo.
Crear un índice de texto en un solo campo
Supongamos que tenemos una colección llamada posts
, y contiene documentos como este:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Podríamos querer crear un text
índice en el body
campo, o el abstract
campo, o incluso ambos.
Así es como se crea un text
índice en el body
campo:
db.posts.createIndex( { body : "text" } )
Salida:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Ahora podemos usar getIndexes()
método para ver el índice:
db.posts.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Podemos ver que hay dos índices. El primero es el _id
predeterminado. índice que se crea automáticamente con la colección. El segundo índice es el que acabamos de crear.
MongoDB ha asignado automáticamente un nombre a nuestro índice recién creado. Se llama body_text
.
Crear un índice de texto compuesto
Una colección solo puede tener un text
índice, pero puede ser un índice compuesto si es necesario.
Vamos a crear un índice compuesto que incluya el body
campo y el abstract
campo.
Como se mencionó, una colección solo puede tener un text
index, así que eliminemos el índice que acabamos de crear:
db.posts.dropIndex("body_text")
Salida:
{ "nIndexesWas" : 2, "ok" : 1 }
Bien, ahora que hemos soltado el text
index, sigamos adelante y creemos otro; esta vez será un índice compuesto:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Salida:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Ese es un mensaje de confirmación que nos dice que solía haber 1 índice pero ahora hay 2.
Revisemos la lista de índices nuevamente:
db.posts.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Tenga en cuenta que el text
compuesto los índices tienen las siguientes restricciones:
- Un
text
compuesto El índice no puede incluir ningún otro tipo de índice especial, como campos de índice geoespacial o de clave múltiple. - Si el
text
compuesto el índice incluye claves que preceden altext
clave de índice, para realizar un$text
búsqueda, el predicado de consulta debe incluir condiciones de coincidencia de igualdad en las claves anteriores. - Al crear un
text
compuesto índice, todotext
las claves de índice deben enumerarse de forma adyacente en el documento de especificación de índice.
Crear un índice de texto comodín
Puede crear un índice de texto comodín utilizando el comodín $**
patrón de campo.
Descartemos el índice anterior y creemos un índice de texto comodín:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB también nos brinda la capacidad de crear índices comodín, sin embargo, los índices de texto comodín y los índices comodín son dos cosas distintas.
En particular, los índices de texto comodín admiten el $text
operador, mientras que los índices comodín no lo hacen.
Los weights
Parámetro
Al crear text
índices, tiene la opción de especificar un peso en uno o más campos. De forma predeterminada, a cada campo se le da un peso de 1. Pero puede cambiar esto para darle a los campos más o menos peso en los resultados de búsqueda.
Ejemplo
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Empecé descartando el índice anterior.
Cuando creé el nuevo text
index, especifiqué 3 campos. Cuando especifiqué los pesos, especifiqué pesos para solo dos de esos campos.
El resultado es que esos dos campos se ponderarán como se especifica, y el otro campo (title
) tendrá el peso predeterminado de 1.
Podemos ver esto cuando ejecutamos getIndexes()
de nuevo:
db.posts.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "title_text_body_text_abstract_text", "weights" : { "abstract" : 5, "body" : 10, "title" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Esto significa que el body
el campo tendrá el doble de significado que el abstract
y diez veces la importancia del title
campo.
Creación de índices de texto en varios idiomas
Notarás que el text
anterior el índice incluye "default_language" : "english"
y "language_override" : "language"
en su definición.
Estos campos ayudan a manejar documentos en varios idiomas. Los valores en el índice anterior son los valores predeterminados.
Cuando crea un documento, puede especificar el idioma de ese documento usando el language
(o algún otro campo definido en el language_override
campo del text
índice). Si dicho campo no existe en el documento, utilizará el idioma predeterminado especificado en el default_language
campo.
Puede especificar un default_language
(y language_override
) al crear el índice.
Consulte Crear un índice de texto en varios idiomas en MongoDB para ver ejemplos de creación de índices de texto compatibles con varios idiomas.