Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Limitar las entradas de índice de texto escaneadas en implementaciones autogestionadas

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.

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.

Crear un índice compuesto en la colección inventory que contenga los siguientes campos:

  • Una clave de índice ascendente o descendente en el campo department

  • Una clave de índice text en el campo description

db.inventory.createIndex(
{
department: 1,
description: "text"
}
)

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' } ]

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.

Volver

Asigne pesos a los resultados de la consulta $text

En esta página