O MongoDB nos fornece a capacidade de criar índices de texto curinga.
Índices de texto curinga são semelhantes aos índices curinga, exceto que os índices de texto curinga suportam o
$text
operador, enquanto os índices curinga não. Dito isso, a criação de cada tipo de índice é muito semelhante no sentido de que ambos compartilham o curinga
$**
padrão de campo. Exemplo
Suponha que tenhamos uma coleção chamada
posts
, e contém documentos que se parecem com isso:{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Poderíamos criar um índice de texto curinga nessa coleção assim:
db.posts.createIndex( { "$**": "text" } )
Saída:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Que usa o caractere curinga
$**
padrão de campo para criar um índice em todos os campos de texto. Quando você cria um índice como este, o MongoDB indexa cada campo que contém dados de string para cada documento na coleção. Fazer isso pode ser útil se a coleção contiver muito conteúdo não estruturado e não houver consistência de campos de texto nos documentos. Nesses casos, você não poderá incluir explicitamente os campos no índice porque não saberia quais campos estarão nos documentos.
Campos ponderados
Você pode usar os
weights
parâmetro para atribuir pesos diferentes aos campos em um índice de texto curinga. Exemplo:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Saída:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
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()
para retornar todos os índices da coleção, 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
.