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.
Sobre esta tarefa
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.
Antes de começar
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" ] } ] )
Procedimento
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.
Resultados
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
.
Correspondências em content
e about
campos
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
.
Correspondências em keywords
e about
campos
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
.
Várias correspondências em um único documento
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
ekeywords
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.
Saiba mais
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 .