Crie um índice de texto em sistemas autogerenciados
Nesta página
Observação
Esta página descreve as funcionalidades de consulta de texto para implantações autogerenciadas (não Atlas). Para dados hospedados no MongoDB Atlas, o MongoDB oferece uma solução aprimorada de consulta de texto completo, Atlas Search.
Os índices de texto suportam pesquisa de query de texto em campos que contêm conteúdo de string. Os índices de texto melhoram o desempenho ao pesquisar palavras ou frases específicas no conteúdo da string.
Para criar um índice de texto, use o método db.collection.createIndex()
. Para indexar um campo que contém uma string ou uma array de elementos de string, especifique a string "text"
como a chave do índice:
db.<collection>.createIndex( { <field1>: "text", <field2>: "text", ... } )
Sobre esta tarefa
Uma coleção pode ter no máximo um índice de texto.
O Atlas Search (disponível no MongoDB Atlas) suporta vários índices de pesquisa com texto completo em uma única coleção. Para saber mais, consulte a documentação do Atlas Search.
Você pode indexar vários campos em um único índice de texto. Um índice de texto pode conter até 32 campos. Para ver um exemplo, consulte Criar um índice de texto composto.
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" ] } ] )
Procedimentos
Os exemplos a seguir mostram como:
Criar um índice de texto de campo único
Crie um índice de texto no campo content
:
db.blog.createIndex( { "content": "text" } )
O índice oferece suporte a queries de pesquisa de texto no campo content
. Por exemplo, a query a seguir retorna documentos onde o campo content
contém a string coffee
:
db.blog.find( { $text: { $search: "coffee" } } )
Saída:
[ { _id: 1, content: 'This morning I had a cup of coffee.', about: 'beverage', keywords: [ 'coffee' ] }, { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ] } ]
Correspondências em campos não indexados
O índice { "content": "text" }
inclui apenas o campo content
e não retorna correspondências em campos não indexados. Por exemplo, a seguinte query pesquisa a coleção blog
para a string food
:
db.blog.find( { $text: { $search: "food" } } )
A query anterior não retorna nenhum documento. Embora a string food
apareça nos documentos _id: 2
e _id: 3
, ela aparece nos campos about
e keywords
respectivamente. Os campos about
e keywords
não são incluídos no índice de texto, portanto, não afetam os resultados da query de pesquisa de texto.
Criar um índice de texto composto
Observação
Antes de criar o índice neste exemplo, você deve descartar todos os índices de texto existentes na coleção blog
.
Crie um índice de texto composto nos campos about
e keywords
na coleção blog
:
db.blog.createIndex( { "about": "text", "keywords": "text" } )
O índice suporta queries de pesquisa de texto nos campos about
e keywords
. Por exemplo, a query a seguir retorna documentos em que a string food
aparece no campo about
ou keywords
:
db.blog.find( { $text: { $search: "food" } } )
Saída:
[ { _id: 3, content: 'My favorite flavors are strawberry and coffee', about: 'ice cream', keywords: [ 'food', 'dessert' ] }, { _id: 2, content: 'Who likes chocolate ice cream for dessert?', about: 'food', keywords: [ 'poll' ] } ]