Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Menu Docs
Página inicial do Docs
/ /

$text queries

Observação

O MongoDB oferece uma solução aprimorada de pesquisa de texto completo, MongoDB Search, e uma solução de pesquisa semântica, MongoDB Vector Search. Recomendamos usar os estágios $search, $searchMeta ou $vectorSearch em vez do operador $text.

Para executar queries do $text, você deve ter um índice de texto na sua coleção. O MongoDB fornece índices de texto para dar suporte a queries $text 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 coleção só pode ter um índice de texto, mas esse índice pode cobrir 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.

Este exemplo demonstra como construir um índice de texto e usá-lo para encontrar "coffee shops", considerando apenas campos de texto.

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" }
]
)

Execute o seguinte em mongosh para permitir $text queries sobre os campos name e description:

db.stores.createIndex( { name: "text", description: "text" } )

Você pode pesquisar strings exatas com várias palavras colocando-as entre aspas duplas. $text query só corresponde a documentos que incluam 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.

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" } } )

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.

Voltar

Pesquisa de texto

Nesta página