Ordenación por puntuación de texto con $meta
Proyectará y ordenará por textScore para mostrar primero los documentos más relevantes en los resultados.
Ordenación por puntuación de texto con $meta es una lección gratuita de MongoDB Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de MongoDB Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de MongoDB Academy incluye 4 lecciones en total.
¿Qué es textScore?
Cuando se ejecuta una consulta $text, MongoDB calcula para cada documento coincidente una puntuación de relevancia denominada textScore. Esta puntuación indica en qué medida coincide el documento con los términos de búsqueda: aumentan la puntuación un mayor número de apariciones de los términos, las coincidencias en campos con mayor peso y las coincidencias de tokens menos frecuentes. De forma predeterminada, los resultados no se ordenan por puntuación; debe solicitar explícitamente esa ordenación.
Proyectar textScore con $meta
Para incluir la puntuación de relevancia en los resultados, añada un campo de proyección mediante { $meta: 'textScore' }. Puede llamar a este campo como prefiera (convencionalmente, score). La expresión $meta lee los metadatos calculados durante la ejecución de la consulta; en este contexto, textScore es el único valor de metadatos compatible actualmente.
db.articles.find(
{ $text: { $search: 'mongodb performance' } },
{
title: 1,
score: { $meta: 'textScore' } // project the relevance score
}
);Ordenar por textScore
Para ordenar los resultados por relevancia, pase { score: { $meta: 'textScore' } } a .sort(). MongoDB ordena textScore en orden descendente de forma predeterminada (primero la mayor relevancia). Debe proyectar el campo de puntuación en la misma consulta cuando ordene por él; si omite la proyección, MongoDB seguirá ordenando correctamente, pero no devolverá el valor de la puntuación al cliente.
db.articles
.find(
{ $text: { $search: 'mongodb performance index' } },
{ title: 1, score: { $meta: 'textScore' } }
)
.sort({ score: { $meta: 'textScore' } });
// Results ordered: most relevant firstCómo se calcula textScore
El textScore de MongoDB se basa en una variante de la lógica TF-IDF (frecuencia de término y frecuencia inversa de documento). Frecuencia del término: un documento en el que la palabra de búsqueda aparece 10 veces obtiene una puntuación mayor que otro en el que aparece una vez. Pesos de los campos: las coincidencias en un campo con peso 10 obtienen una puntuación 10 veces mayor que las coincidencias en un campo con peso 1. Densidad del índice: las palabras poco frecuentes que aparecen en menos documentos contribuyen más a la puntuación que las palabras muy comunes.
// Index with weights: title matches count more
db.articles.createIndex(
{ title: 'text', body: 'text' },
{ weights: { title: 10, body: 1 } }
);
// A document where 'mongodb' appears in the title
// scores 10x higher than one where it only appears in the body$meta en pipelines de agregación
En los pipelines de agregación, use { $meta: 'textScore' } dentro de una etapa $addFields o $project para adjuntar la puntuación y, después, encadene una etapa $sort. Recuerde que la etapa $match con $text debe aparecer al principio del pipeline para que MongoDB pueda calcular la puntuación antes de que otras etapas transformen el flujo de documentos.
db.articles.aggregate([
{ $match: { $text: { $search: 'nosql tutorial' } } },
{ $addFields: { score: { $meta: 'textScore' } } },
{ $sort: { score: -1 } },
{ $limit: 5 },
{ $project: { _id: 0, title: 1, score: 1 } }
]);Combinar la ordenación por textScore con otras ordenaciones
Puede combinar la ordenación por textScore con otras claves de ordenación. Por ejemplo, puede ordenar primero por relevancia y después por fecha como criterio de desempate. MongoDB procesa las claves de ordenación de izquierda a derecha, así que coloque textScore primero para dar prioridad a la relevancia. Las claves adicionales solo determinan el orden entre los documentos con valores de textScore iguales.
db.articles
.find(
{ $text: { $search: 'mongodb' } },
{ title: 1, createdAt: 1, score: { $meta: 'textScore' } }
)
.sort({
score: { $meta: 'textScore' }, // relevance first
createdAt: -1 // then newest
});Filtrar por puntuación mínima
Si desea devolver únicamente documentos muy relevantes, puede filtrar por un textScore mínimo mediante la expresión $meta dentro de una etapa $match (en una agregación), después de la coincidencia de texto. Esto no es posible con un filtro directo de find(); necesita el pipeline de agregación para calcular primero la puntuación y filtrarla después.
db.articles.aggregate([
{ $match: { $text: { $search: 'mongodb nosql' } } },
{ $addFields: { score: { $meta: 'textScore' } } },
{ $match: { score: { $gte: 1.5 } } }, // only high-relevance docs
{ $sort: { score: -1 } },
{ $project: { title: 1, score: 1 } }
]);textScore no garantiza valores absolutos
Los valores de textScore son relativos dentro de un conjunto de resultados de una consulta, no absolutos ni comparables entre consultas diferentes o distintos estados de una colección. Una puntuación de 2.5 hoy podría convertirse en 3.1 mañana si añade más documentos a la colección, ya que cambiarían los cálculos de frecuencia de términos. Use textScore para ordenar los resultados dentro de un conjunto de resultados, no como una métrica de calidad almacenada.
// Scores vary depending on collection content
// Useful for RANKING within a search result, not for thresholds
// Bad pattern:
const MIN_SCORE = 2.0; // this threshold will drift as data grows
// Better pattern:
// Return the top N results sorted by score
db.articles
.find({ $text: { $search: 'mongodb' } }, { score: { $meta: 'textScore' } })
.sort({ score: { $meta: 'textScore' } })
.limit(10);Paginación de resultados de búsqueda de texto
La paginación estándar con skip()/limit() funciona con la búsqueda de texto, pero presenta el problema de rendimiento habitual en desplazamientos profundos. Como los resultados se clasifican por relevancia en lugar de ordenarse mediante un campo estable, la paginación por conjunto de claves no es sencilla para los resultados de texto. Un patrón habitual consiste en usar la paginación por desplazamiento durante las primeras páginas, donde suele detenerse la mayoría de los usuarios, y considerar Atlas Search para obtener una paginación más profunda y coherente a gran escala.
// Page 1 (skip 0)
db.articles
.find({ $text: { $search: 'mongodb' } }, { score: { $meta: 'textScore' } })
.sort({ score: { $meta: 'textScore' } })
.skip(0).limit(10);
// Page 2 (skip 10) - gets slower on large result sets
db.articles
.find({ $text: { $search: 'mongodb' } }, { score: { $meta: 'textScore' } })
.sort({ score: { $meta: 'textScore' } })
.skip(10).limit(10);textScore en Mongoose
Al usar Mongoose, puede acceder a textScore mediante la opción { meta: 'textScore' } en una ruta del esquema o usando .select() con la proyección de metadatos score. Mongoose encapsula la API del controlador de MongoDB, por lo que el concepto subyacente es el mismo; solo necesita conocer la sintaxis de Mongoose para proyectar y ordenar por metadatos.
// Mongoose text search with score projection
const results = await Article.find(
{ $text: { $search: 'mongodb nosql' } },
{ score: { $meta: 'textScore' } } // same $meta syntax
).sort({ score: { $meta: 'textScore' } });
console.log(results.map(r => ({ title: r.title, score: r.score })));Cuándo textScore no es suficiente
Los índices de texto nativos funcionan bien en casos de uso sencillos, pero carecen de funciones como autocompletado, búsqueda por facetas, sinónimos y funciones de clasificación personalizadas. Cuando necesita estas capacidades, MongoDB Atlas Search, basado en Apache Lucene, proporciona un motor de puntuación de relevancia mucho más completo, con puntuación BM25, potenciación y resultados de explicación para ajustar la relevancia.
// Atlas Search provides richer scoring with the score option
// db.articles.aggregate([
// { $search: {
// text: { query: 'mongodb', path: 'title', score: { boost: { value: 3 } } },
// } },
// { $addFields: { score: { $meta: 'searchScore' } } },
// { $sort: { score: -1 } }
// ]);
// --> Use Atlas Search when textScore is insufficientComprobación rápida
Compruebe su comprensión de la ordenación por puntuación de texto con $meta.
Resumen de la lección
En esta lección ha aprendido que textScore es una puntuación de relevancia por documento que se calcula durante las consultas $text, que { $meta: 'textScore' } proyecta y ordena según esta puntuación, y que los pesos de los campos y la frecuencia de los términos determinan la magnitud de la puntuación. A continuación veremos las limitaciones de los índices de texto y cuándo Atlas Search es una opción más adecuada.
Aprende JavaScript con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Ordenación por puntuación de texto con $meta» es gratis?
Sí — el texto completo de «Ordenación por puntuación de texto con $meta» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de MongoDB Academy, actualiza a CoddyKit PRO. El curso de MongoDB Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Ordenación por puntuación de texto con $meta»?
Proyectará y ordenará por textScore para mostrar primero los documentos más relevantes en los resultados. Practicas MongoDB Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar MongoDB Academy?
No se requiere experiencia previa. MongoDB Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Ordenación por puntuación de texto con $meta»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de MongoDB Academy?
Sí. Cada lección de MongoDB Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Creación de un índice de texto en campos de tipo cadena
- Ejecución de consultas $text con frases y negación
- Ordenación por puntuación de texto con $meta
- Limitaciones de los índices de texto y cuándo usar Atlas Search