Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Asignar pesos a los resultados de la $text query en implementaciones autogestionadas

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.

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.

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" ]
}
] )

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:

  • content tiene un peso de 10.

  • keywords tiene un peso de 5.

  • about tiene un peso por defecto de 1.

Estos pesos indican la importancia relativa de los campos indexados entre sí.

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.

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 content en el documento con _id: 2.

  • El campo about en 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.

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 keywords en el documento con _id: 3.

  • El campo about en 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.

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 content y keywords en el documento con _id: 1.

  • El campo content en 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.

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.

Volver

Use cualquier campo para especificar el lenguaje del índice de texto

En esta página