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 búsqueda de texto en implementaciones autogestionadas

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.

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.

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 ponderaciones:

  • 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 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 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 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 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 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 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 el número de coincidencias por el peso del campo correspondiente y suma los resultados.

Para aprender más sobre la búsqueda de texto en MongoDB, consulte:

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.

Volver

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

En esta página