Quando você cria um
text
index no MongoDB, você tem a opção de aplicar pesos diferentes a cada campo indexado. Esses pesos denotam a significância relativa dos campos indexados entre si. Um campo com peso maior terá mais impacto nos resultados da pesquisa do que um campo com peso menor.
Isso fornece a você um certo controle sobre como os resultados da pesquisa são calculados.
O peso padrão é 1, portanto, se você não especificar um peso para o campo, será atribuído um peso de 1.
Exemplo
Suponha que tenhamos uma coleção chamada
posts
, e contém documentos como este:{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Poderíamos criar um
text
composto indexe aos três campos de texto e aplique pesos diferentes a cada um. Assim:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Quando criei o composto
text
index, especifiquei 3 campos. Quando especifiquei os pesos, especifiquei pesos para apenas dois desses campos. O resultado é que esses dois campos serão ponderados conforme especificado, e o outro campo (
title
) terá o peso padrão de 1. Podemos ver isso quando executamos
getIndexes()
:db.posts.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "title_text_body_text_abstract_text", "weights" : { "abstract" : 5, "body" : 10, "title" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Isso significa que o
body
campo terá o dobro do significado do abstract
campo e dez vezes o significado do title
campo. Índices de texto curinga com campos ponderados
Você pode aplicar pesos ao criar índices de texto curinga. Índices de texto curinga podem ser úteis quando você não sabe quais serão os campos de texto nos documentos. Você pode conhecer algumas , mas nem todos.
Nesses casos, você pode criar um índice de texto curinga e atribuir um peso aos campos que você conhece. Quaisquer outros campos serão atribuídos ao valor padrão de 1.
Suponha que temos o seguinte documento como diretriz:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
É semelhante ao documento anterior, exceto que agora tem um
tags
campo que contém uma matriz. Mas, pelo que sabemos, documentos futuros nessa coleção podem ter outros campos, como talvez categories
, keywords
, author_bio
, etc Mas na verdade não sabemos, então criaremos um índice de texto curinga que encapsulará todos os campos com dados de string. E vamos criar ponderações para alguns dos campos conhecidos.
Exemplo:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Nesse caso, o
body
campo recebe um peso de 10
e o abstract
campo recebe um peso de 5
. Isso significa que o body
campo tem o dobro do impacto do campo de resumo e dez vezes o impacto de todos os outros campos de texto (porque eles receberão o peso padrão de 1). Depois de criar esse índice, se chamarmos
getIndexes()
, podemos ver os pesos dados aos campos:db.posts.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "$**_text", "weights" : { "$**" : 1, "abstract" : 5, "body" : 10 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Como esperado, o
body
campo obtém 10
, o abstract
campo recebe 5
, e todos os outros recebem 1
.