Cuando MongoDB devuelve resultados de búsqueda de texto, asigna una puntuación a cada documento devuelto. El puntaje indica la relevancia del documento para una consulta de búsqueda determinada. Puedes ordenar los documentos devueltos por puntuación para que los documentos más relevantes aparezcan primero en el conjunto de resultados.
Si tienes un índice compuesto con múltiples claves de índice de texto, puedes especificar diferentes pesos para cada campo indexado. El peso de un campo indexado indica la importancia del campo en relación con los otros campos indexados, ya que los pesos más altos resultan en mayores puntuaciones en la búsqueda de texto.
Por ejemplo, puedes resaltar las coincidencias de búsqueda en una title campo si sabes que los usuarios probablemente buscarán títulos, o si title contiene más términos de búsqueda relevantes en comparación con otros campos de documentos.
El peso por defecto para indexado es 1 para los campos indexados. Para ajustar los pesos de los campos indexados, incluye la opción de pesos en el método db.collection.createIndex(), como se observa en este ejemplo:
db.<collection>.createIndex( { <field1>: "text", <field2>: "text", ... }, { weights: { <field1>: <weight>, <field2>: <weight>, ... }, name: <indexName> } )
Importante
Si cambias los pesos de tu índice después de creado, MongoDB necesita volver a indexar la colección. La reindexación puede afectar negativamente el rendimiento, especialmente en colecciones grandes. Para obtener más información, consulta Creación de índices en colecciones pobladas.
Acerca de esta tarea
Tienes una blog colección que contiene documentos para entradas de blog individuales. Cada documento contiene:
El contenido de la publicación.
El tema que trata la publicación.
Una lista de palabras clave relacionadas con la publicación.
Deseas crear un índice de texto para que los usuarios puedan realizar búsquedas de texto en entradas de blog. Tu aplicación admite búsquedas por contenido, temas y palabras clave.
Quieres priorizar las coincidencias en el campo content sobre otros campos del documento. Usa los pesos de índice para asignar mayor relevancia a las coincidencias en content y ordenar los resultados de la query para que las coincidencias de content aparezcan primero.
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" ] } ] )
Procedimiento
Crea un índice text con diferentes pesos para cada campo indexado:
db.blog.createIndex( { content: "text", keywords: "text", about: "text" }, { weights: { content: 10, keywords: 5 }, name: "BlogTextIndex" } )
El índice text tiene los siguientes campos y ponderaciones:
contenttiene un peso de 10.keywordstiene un peso de 5.abouttiene un peso por defecto de 1.
Estos pesos indican la importancia relativa de los campos indexados entre sí.
Resultados
Los siguientes ejemplos muestran cómo los diferentes pesos para los campos indexados afectan las puntuaciones de los resultados. Cada ejemplo ordena los resultados en función del textScore de cada documento. Para acceder a los atributos textScore de los documentos, utilice el operador $meta.
Coincidencias en los campos de content y about
La siguiente query busca en los documentos de la colección blog la string ice cream:
db.blog.find( { $text: { $search: "ice cream" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
Salida:
[ { _id: 2, content: 'Who likes chocolate ice cream for dessert?', about: 'food', keywords: [ 'food', 'poll' ], score: 12 }, { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ], score: 1.5 } ]
La string de búsqueda ice cream coincide con:
El campo
contenten el documento con_id: 2.El campo
abouten el documento con_id: 3.
Una coincidencia de término en el campo content tiene 10 veces el impacto (10:1 peso) que una coincidencia de término en el campo keywords.
Coincidencias en los campos de keywords y about
La siguiente query busca en los documentos de la colección blog la string food:
db.blog.find( { $text: { $search: "food" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
Salida:
[ { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ], score: 5.5 }, { _id: 2, content: "Who likes chocolate ice cream for dessert?", about: 'food', keywords: [ 'poll' ], score: 1.1 } ]
La string de búsqueda food coincide con:
El campo
keywordsen el documento con_id: 3.El campo
abouten el documento con_id: 2.
Una coincidencia de término en el campo keywords tiene 5 veces el impacto (5:1 peso) que una coincidencia de término en el campo about.
Coincidencias múltiples en un solo documento
La siguiente query busca en los documentos de la colección blog la string coffee:
db.blog.find( { $text: { $search: "coffee" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
Salida:
[ { _id: 1, content: 'This morning I had a cup of coffee.', about: 'beverage', keywords: [ 'coffee' ], score: 11.666666666666666 }, { _id: 3, content: 'My favorite cake flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ], score: 6 } ]
La string de búsqueda coffee coincide con:
Los campos
contentykeywordsen el documento con_id: 1.El campo
contenten el documento con_id: 3.
Para calcular el score cuando una cadena de búsqueda coincide con varios campos, MongoDB multiplica el número de coincidencias por el peso del campo correspondiente y suma los resultados.
Obtén más información
Para aprender más sobre la búsqueda de texto en MongoDB, consulte:
Operadores de búsqueda de texto (Implementaciones autogestionadas)
Lenguajes de búsqueda de texto en implementaciones autogestionadas
Nota
Búsqueda de Atlas
Para datos alojados en MongoDB Atlas,
Atlas Search proporciona una puntuación personalizada más robusta que los índices text. Para obtener más información, consulta la documentación de Atlas Search Puntaje.