Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ / /

Atribuir pesos aos resultados da pesquisa de texto em sistemas autogerenciados

Quando o MongoDB retorna resultados de pesquisa de texto, ele atribui uma pontuação a cada documento retornado. A pontuação indica a relevância do documento para uma determinada consulta de pesquisa. Você pode classificar documentos devolvidos por pontuação para que os documentos mais relevantes apareçam primeiro no conjunto de resultados.

Se você tiver umíndice composto com múltiplas chaves de índice de texto, você poderá especificar diferentes pesos para cada campo indexado. O peso de um campo indexado indica a importância do campo em relação aos outros campos indexados, com pesos mais altos resultando em pontuações de pesquisa de texto mais altas.

Por exemplo, você pode enfatizar as correspondências de pesquisa em um campo title se você souber que os usuários provavelmente pesquisarão por títulos, ou se o title tiver termos de pesquisa mais relevantes em comparação com outros campos de documento.

O peso padrão para indexado é 1 para os campos indexados. Para ajustar os pesos dos campos indexados, inclua a opção de pesos no método db.collection.createIndex(), conforme mostrado neste exemplo:

db.<collection>.createIndex(
{
<field1>: "text",
<field2>: "text",
...
},
{
weights: {
<field1>: <weight>,
<field2>: <weight>,
...
},
name: <indexName>
}
)

Importante

Se você alterar os pesos em seu índice após ele ser criado, o MongoDB precisará reindexar a coleção. A reindexação pode afetar negativamente o desempenho, especialmente em grandes coleções. Para obter mais informações, consulte Index Builds on PopulatedCollections.

Você tem uma coleção blog que contém documentos para postagens de blog individuais. Cada documento contém:

  • O conteúdo da publicação.

  • O tópico abordado pela postagem.

  • Uma lista de palavras-chave relacionadas à postagem.

Você deseja criar um índice de texto para que os usuários possam realizar pesquisas de texto em postagens de blog. A sua aplicação suporta pesquisas sobre conteúdo, tópicos e palavras-chave.

Você deseja priorizar as correspondências no campo content sobre outros campos de documento. Use pesos de índice para atribuir maior importância às correspondências em content e classifique os resultados da consulta para que content as correspondências apareçam primeiro.

Criar uma coleção blog com os seguintes 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" ]
}
] )

Crie um índice text com diferentes pesos para cada campo indexado:

db.blog.createIndex(
{
content: "text",
keywords: "text",
about: "text"
},
{
weights: {
content: 10,
keywords: 5
},
name: "BlogTextIndex"
}
)

O índice text tem os seguintes campos e pesos:

  • content tem um peso de 10.

  • keywords tem um peso de 5.

  • about tem o peso padrão de 1.

Esses pesos indicam a importância relativa dos campos indexados entre si.

Os exemplos a seguir mostram como diferentes pesos para campos indexados afetam as pontuações de resultados. Cada exemplo classifica os resultados com base nos textScore de cada documento. Para acessar os atributos textScore dos documentos, use o operador $meta.

A seguinte consulta pesquisa documentos na coleção blog para a string ice cream:

db.blog.find(
{
$text: { $search: "ice cream" }
},
{
score: { $meta: "textScore" }
}
).sort( { score: { $meta: "textScore" } } )

Saída:

[
{
_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
}
]

A string de pesquisa ice cream corresponde a:

  • O campo content no documento com _id: 2.

  • O campo about no documento com _id: 3.

Uma correspondência de termo no campo content tem 10 vezes o impacto (peso 10:1) como uma correspondência de termo no campo keywords.

A seguinte consulta pesquisa documentos na coleção blog para a string food:

db.blog.find(
{
$text: { $search: "food" }
},
{
score: { $meta: "textScore" }
}
).sort( { score: { $meta: "textScore" } } )

Saída:

[
{
_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
}
]

A string de pesquisa food corresponde a:

  • O campo keywords no documento com _id: 3.

  • O campo about no documento com _id: 2.

Uma correspondência de termo no campo keywords tem 5 vezes o impacto (peso 5:1) como uma correspondência de termo no campo about.

A seguinte consulta pesquisa documentos na coleção blog para a string coffee:

db.blog.find(
{
$text: { $search: "coffee" }
},
{
score: { $meta: "textScore" }
}
).sort( { score: { $meta: "textScore" } } )

Saída:

[
{
_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
}
]

A string de pesquisa coffee corresponde a:

  • Os campos content e keywords no documento com _id: 1.

  • O campo content no documento com _id: 3.

Para calcular o score quando uma string de pesquisa corresponde a vários campos, o MongoDB multiplica o número de correspondências pelo peso do campo correspondente e soma os resultados.

Para saber mais sobre a pesquisa de texto no MongoDB, consulte:

Observação

Atlas Search

Para dados hospedados no MongoDB Atlas, o Atlas Search fornece uma pontuação personalizada mais robusta do que text índices. Para saber mais, consulte a documentação de Pontuação do Atlas Search .

Voltar

Uso do campo

Nesta página