Nota
Esta página describe las capacidades de query de texto para implementaciones autogestionadas (no-Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de query de texto completo. Búsqueda Atlas y una solución de búsqueda vectorial, Búsqueda vectorial Atlas.
Los índices de texto permiten realizar consultas de búsqueda de texto en campos que contienen contenido del tipo string. Los índices de texto mejoran el rendimiento cuando se busca palabras específicas o frases de varias palabras dentro del contenido de string.
Para crear un índice de texto, use el db.collection.createIndex() método. Para indexar un campo que contiene un string o un arreglo de elementos string, especifica el string "text" como la clave de índice:
db.<collection>.createIndex( { <field1>: "text", <field2>: "text", ... } )
Acerca de esta tarea
Una colección puede tener como máximo un índice de texto.
Atlas Search (disponible en MongoDB Atlas) admite múltiples índices de texto completo en una sola colección. Para obtener más información, consulta la documentación de Atlas Search.
Puedes indexar varios campos en un solo índice de texto. Un índice de texto puede contener hasta 32 campos. Para ver un ejemplo, consulte Crear un índice de texto compuesto.
Antes de comenzar
Crea una colección blog con los siguientes documentos:
db.blog.insertMany( [ { _id: 1, content: "This morning I had a cup of coffee.", about: "beverage", keywords: [ "coffee" ] }, { _id: 2, content: "Who likes chocolate ice cream for dessert?", about: "food", keywords: [ "poll" ] }, { _id: 3, content: "My favorite flavors are strawberry and coffee", about: "ice cream", keywords: [ "food", "dessert" ] } ] )
Procedimientos
Los siguientes ejemplos le muestran cómo:
Crear un índice de texto de campo único
Crear un índice de texto en el campo content:
db.blog.createIndex( { "content": "text" } )
El índice admite consultas de búsqueda de texto en el campo content. Por ejemplo, la siguiente query devuelve documentos en los que el campo content contiene la string coffee:
db.blog.find( { $text: { $search: "coffee" } } )
Salida:
[ { _id: 1, content: 'This morning I had a cup of coffee.', about: 'beverage', keywords: [ 'coffee' ] }, { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ] } ]
Coincidencias en campos no indexados
El índice { "content": "text" } solo incluye el campo content y no devuelve coincidencias en campos no indexados. Por ejemplo, la query siguiente busca la cadena food en la colección blog:
db.blog.find( { $text: { $search: "food" } } )
La query anterior no devuelve documentos. Aunque la string food aparece en los documentos _id: 2 y _id: 3, aparece en los campos about y keywords respectivamente. Los campos about y keywords no están incluidos en el índice de texto y, por tanto, no afectan a los resultados de la consulta de búsqueda de texto.
Crea un índice de texto compuesto
Nota
Antes de poder crear el índice en este ejemplo, debe eliminar cualquier índice de texto existente en la blog colección.
Crea un índice de texto compuesto en los campos about y keywords en la colección blog:
db.blog.createIndex( { "about": "text", "keywords": "text" } )
El índice admite consultas de búsqueda de texto en los campos about y keywords. Por ejemplo, la siguiente query devuelve documentos donde la cadena food aparece en el campo about o keywords :
db.blog.find( { $text: { $search: "food" } } )
Salida:
[ { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ] }, { _id: 2, content: 'Who likes chocolate ice cream for dessert?', about: 'food', keywords: [ 'poll' ] } ]