Realizar uma pesquisa de texto (sistemas autogerenciados)
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.
Para executar consultas de queries de texto em sistemas autogerenciados, você deve ter umíndice de texto na sua collection. O MongoDB fornece índices de texto para dar suporte à pesquisa de queries no conteúdo da string. Os índices de texto podem incluir qualquer campo cujo valor seja uma string ou uma array de elementos da string. Uma collection só pode ter um índice de pesquisa de texto, mas esse índice pode abranger vários campos.
Consulte a seção Índices de texto em sistemas autogerenciados para obter uma referência completa sobre índices de texto, incluindo comportamento, tokenização e propriedades.
Exemplos
Este exemplo demonstra como construir um índice de texto e usá-lo para encontrar "coffee shops", considerando apenas campos de texto.
Criar uma coleção
Crie uma collection stores
com os seguintes documentos:
db.stores.insertMany( [ { _id: 1, name: "Java Hut", description: "Coffee and cakes" }, { _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" }, { _id: 3, name: "Coffee Shop", description: "Just coffee" }, { _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" }, { _id: 5, name: "Java Shopping", description: "Indonesian goods" }, { _id: 6, name: "NYC_Coffee Shop", description: "local NYC coffee" } ] )
Criar um índice de texto
Execute o seguinte em mongosh
para permitir a pesquisa de texto sobre os campos name
e description
:
db.stores.createIndex( { name: "text", description: "text" } )
Pesquisar uma string exata
Você pode pesquisar strings exatas com várias palavras colocando-as entre aspas duplas. A pesquisa de texto corresponde apenas a documentos que incluem toda a string.
Por exemplo, a consulta a seguir encontra todos os documentos que contêm a string "coffee shop":
db.stores.find( { $text: { $search: "\"coffee shop\"" } } )
Esta query retorna os seguintes documentos:
[ { _id: 3, name: 'Coffee Shop', description: 'Just coffee' }, { _id: 6, name: 'NYC_Coffee Shop', description: 'local NYC coffee' } ]
A menos que especificado, a pesquisa exata de string não diferencia maiúsculas de minúsculas ou diacríticos. Por exemplo, a seguinte query retorna os mesmos resultados da query anterior:
db.stores.find( { $text: { $search: "\"COFFEé SHOP\"" } } )
A pesquisa de string exata não lida com palavras derivadas ou vazias.
Excluir um termo
Para excluir uma palavra, você pode preceder um caractere "-
". Por exemplo, para encontrar todas as lojas que contenham "java" ou "shop", mas não "coffee", use o seguinte:
db.stores.find( { $text: { $search: "java shop -coffee" } } )
Ordenar os resultados
O MongoDB retorna seus resultados em ordem sem classificação por padrão. No entanto, as queries do $text
calculam uma pontuação de relevância para cada documento que especifica quão bem um documento corresponde à query.
Para classificar os resultados em ordem de pontuação de relevância, você deve projetar explicitamente o campo $meta
textScore
e classificá-lo:
db.stores.find( { $text: { $search: "java coffee shop" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } )
$text
também está disponível no agregação pipeline.