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:
contenttem um peso de 10.keywordstem um peso de 5.abouttem 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
contentno documento com_id: 2.O campo
aboutno 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
keywordsno documento com_id: 3.O campo
aboutno 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
contentekeywordsno documento com_id: 1.O campo
contentno 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
MongoDB Search
Para dados hospedados no MongoDB, MongoDB Search fornece uma pontuação personalizada mais robusta do que text índices. Para saber mais, consulte a documentação de Pontuação de Pesquisa do MongoDB.