Observação
Esta página descreve os recursos de query de texto para sistemas autogerenciados (não Atlas). Para dados hospedados no MongoDB Atlas, o MongoDB oferece uma solução aprimorada de query de texto completo, Atlas Search , e uma solução de pesquisa vetorial, Atlas Vector Search.
Os índices de texto oferecem suporte a queries de pesquisa de texto em campos que contêm conteúdo de string. Os índices de texto melhoram o desempenho ao pesquisar palavras específicas ou strings de várias palavras 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 somente 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' ] } ]