Si realizas consultas de búsqueda de texto en un conjunto de datos grande, un índice de texto en un solo campo puede escanear una gran cantidad de entradas para devolver resultados, lo que puede resultar en queries lentas.
Para mejorar el rendimiento de las query, puedes crear un índice de texto compuesto e incluye una coincidencia exacta en tus consultas de búsqueda. 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 gerente de tienda consulta con un inventory colección 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 consultas de búsqueda de texto para productos 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 de búsqueda de texto solo escanean documentos que cumplen una condición de igualdad específica 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.