Nota
MongoDB Search ofrece avanzadas capacidades de búsqueda de texto completo, incluyendo una puntuación de relevancia mejorada y un impulso de la puntuación. Recomendamos utilizar el $search etapa con el campo score, en lugar de la $text operador, para asignar y ordenar los resultados de búsqueda de texto según los puntajes de relevancia.
Cuando MongoDB devuelve resultados para $text consultas, 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 tiene un índice compuesto con múltiples claves de índice de texto, puede especificar diferentes pesos para cada campo indexado. El peso de un campo indexado indica la importancia del campo en relación con los demás campos indexados, donde un mayor peso da como resultado puntuaciones más altas.
Por ejemplo, puedes dar mayor importancia a las coincidencias de búsqueda en un campo title si sabes que los usuarios probablemente buscarán títulos, o si title contiene términos de búsqueda más relevantes en comparación con otros campos del documento.
El peso por defecto para los campos indexados es 1. Para ajustar los pesos de los campos indexados, incluye la opción de pesos en el método db.collection.createIndex(), como se ve 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.
Quieres crear un índice de texto para que los usuarios puedan realizar consultas $text 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 las consultas de $text en MongoDB, consulta:
Nota
MongoDB búsqueda
Para los datos alojados en MongoDB, MongoDB Search ofrece una puntuación personalizada más robusta que los índices text. Para obtener más información, consulta la documentación de MongoDB Search Puntuación.