Existem vários tipos de índices que você pode criar no MongoDB. Se você tem um campo que contém uma string ou um array de strings, você pode usar um
text
índice nesse campo. Para criar um
text
index, use a string literal "text"
como o valor ao criá-lo. Criar um índice de texto em um único campo
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..." }
Podemos querer criar um
text
índice no body
campo, ou o abstract
campo, ou mesmo ambos. Veja como criar um
text
índice no body
campo:db.posts.createIndex( { body : "text" } )
Saída:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Agora podemos usar o
getIndexes()
método para visualizar o índice:db.posts.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Podemos ver que existem dois índices. O primeiro é o padrão
_id
índice que é criado automaticamente com a coleção. O segundo índice é o que acabamos de criar. O MongoDB atribuiu automaticamente um nome ao nosso índice recém-criado. Chama-se
body_text
. Criar um índice de texto composto
Uma coleção pode ter apenas um
text
índice, mas pode ser um índice composto, se necessário. Vamos criar um índice composto que inclui o
body
campo e o abstract
campo. Como mencionado, uma coleção pode ter apenas um
text
index, então vamos descartar o índice que acabamos de criar:db.posts.dropIndex("body_text")
Saída:
{ "nIndexesWas" : 2, "ok" : 1 }
OK, agora que removemos o
text
index, vamos em frente e criar outro – desta vez será um índice composto:db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Saída:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Essa é uma mensagem de confirmação que nos diz que costumava haver 1 índice, mas agora existem 2.
Vamos verificar a lista de índices novamente:
db.posts.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text_abstract_text", "weights" : { "abstract" : 1, "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Observe que o composto
text
índices têm as seguintes restrições:- Um
text
composto index não pode incluir nenhum outro tipo de índice especial, como campos de índice multichave ou geoespacial. - Se o composto
text
índice inclui chaves que precedem otext
chave de índice, para executar um$text
search, o predicado de consulta deve incluir condições de correspondência de igualdade nas chaves anteriores. - Ao criar um
text
composto índice, todotext
as chaves de índice devem ser listadas adjacentemente no documento de especificação de índice.
Criar um índice de texto curinga
Você pode criar um índice de texto curinga usando o curinga
$**
padrão de campo. Vamos eliminar o índice anterior e criar um índice de texto curinga:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
O MongoDB também nos fornece a capacidade de criar índices curinga, no entanto, índices de texto curinga e índices curinga são duas coisas distintas.
Em particular, os índices de texto curinga suportam o
$text
operador, enquanto os índices curinga não. Os weights
Parâmetro
Ao criar
text
índices, você tem a opção de especificar um peso em um ou mais campos. Por padrão, cada campo recebe um peso de 1. Mas você pode alterar isso para dar aos campos mais ou menos peso nos resultados da pesquisa. Exemplo
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Comecei abandonando o índice anterior.
Quando criei o novo
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()
novamente: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. Criando índices de texto em vários idiomas
Você notará que o
text
acima index inclui "default_language" : "english"
e "language_override" : "language"
em sua definição. Esses campos ajudam a lidar com documentos em vários idiomas. Os valores no índice acima são os valores padrão.
Ao criar um documento, você pode especificar o idioma desse documento usando o
language
campo (ou algum outro campo definido no language_override
campo do text
índice). Se esse campo não existir no documento, ele usará o idioma padrão especificado no default_language
campo. Você pode especificar um
default_language
(e language_override
) ao criar o índice. Consulte Criar um índice de texto multilíngue no MongoDB para obter exemplos de criação de índices de texto que dão suporte a vários idiomas.