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 varias claves de índice de texto, puede especificar diferentes ponderaciones para cada campo indexado. La ponderación de un campo indexado indica su importancia en relación con los demás campos indexados; las ponderaciones más altas resultan en 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 colección blog que contiene documentos para entradas de blog individuales. Cada documento contiene:
El contenido del post.
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 pesos:
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 consulta busca documentos en la colección blog que contengan la cadena 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 consulta busca documentos en la colección blog que contengan la cadena 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 consulta busca documentos en la colección blog que contengan la cadena 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 la cantidad de coincidencias por el peso del campo correspondiente y suma los resultados.
Obtén más información
Para obtener más información sobre las consultas $text en MongoDB, consulte:
Nota
MongoDB búsqueda
Para los datos alojados en MongoDB, MongoDB Search ofrece una puntuación personalizada más robusta que text los índices. Para obtener más información, consulte la documentación de MongoDB Search Scoring.