Nota
MongoDB ofrece una solución mejorada de búsqueda de texto completo, MongoDB Search, y solución de búsqueda vectorial, MongoDB Vector Search. Recomendamos que utilizar el índice de MongoDB Search o índices de MongoDB Vector Search en lugar índices de texto.
Si ejecutas $text consultas en un gran conjunto de datos, un índice de texto de un único campo puede escanear un gran número de entradas para devolver resultados, lo que puede dar lugar a consultas lentas.
Para mejorar el rendimiento de las query, puedes crear un índice de texto compuesto e incluye una coincidencia exacta en tus $text queries. Si el índice compuesto contiene el campo usado en tu coincidencia exacta, el índice escanea menos entradas y devuelve los resultados más rápido.
Acerca de esta tarea
En este ejemplo, un administrador de tienda consulta una colección inventory que contiene estos documentos:
db.inventory.insertMany( [ { _id: 1, department: "tech", description: "lime green computer" }, { _id: 2, department: "tech", description: "wireless red mouse" }, { _id: 3, department: "kitchen", description: "green placemat" }, { _id: 4, department: "kitchen", description: "red peeler" }, { _id: 5, department: "food", description: "green apple" }, { _id: 6, department: "food", description: "red potato" } ] )
El administrador realiza $text consultas de artículos dentro de un departamento específico.
Un índice de texto compuesto en los campos department y description limita las claves de índice escaneadas solo a los documentos dentro del department especificado. El índice de texto compuesto ofrece un rendimiento mejorado en comparación con un índice de texto de un solo campo en el campo description.
Procedimiento
Crear un índice compuesto en la colección inventory que contenga los siguientes campos:
Una clave de índice ascendente o descendente en el campo
departmentUna clave de índice
texten el campodescription
db.inventory.createIndex( { department: 1, description: "text" } )
Resultados
Después de crear el índice compuesto, las consultas $text solo escanean documentos que coincidan con una condición de igualdad especificada en el campo department.
Por ejemplo, la siguiente consulta escanea documentos con department igual a kitchen donde el campo description contiene la string green:
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } )
Salida:
[ { _id: 3, department: 'kitchen', description: 'green placemat' } ]
Ver el número de documentos examinados
Para ver cuántos documentos fueron escaneados para devolver la query, visualiza la executionStats: de la query
db.inventory.find( { department: "kitchen", $text: { $search: "green" } } ).explain("executionStats")
El número de claves índice examinadas se indica en el campo totalKeysExamined. Las consultas que examinan más claves de índice generalmente tardan más en completarse.
Con el índice compuesto en department y description, la query solo examina una clave de índice. Solo hay un documento en la colección donde department es kitchen y el description contiene la string green.
Sin embargo, si la consulta usó solo un índice de texto de campo único en el campo description, la consulta examinaría tres claves de índice. Hay tres documentos en la colección donde el campo description contiene la string green.
En una colección pequeña como la que se utiliza en el ejemplo anterior, no hay una diferencia notable en el rendimiento entre los índices de texto de un solo campo y los índices compuestos. Sin embargo, en colecciones más grandes, el aumento de los escaneos de entradas del índice puede dificultar notablemente el rendimiento. Para obtener el mejor rendimiento, cree índices de texto que limiten la cantidad de entradas de índice escaneadas para que se adapten mejor a sus coincidencias exactas.