Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Menu Docs
Página inicial do Docs
/ /

$text (operador de predicado da query)

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.

Esta página descreve o operador $text para implantações autogerenciadas.

$text

$text executa uma query de texto em campos indexados com um índice de texto.

Você pode utilizar o $text para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

A expressão $text tem a seguinte sintaxe:

{
$text: {
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>,
$diacriticSensitive: <boolean>
}
}

O operador $text aceita estes campos:

Campo
Tipo
Descrição

$search

string

Uma string de termos que o MongoDB analisa e usa para query o índice de texto. O MongoDB realiza uma query OR lógica sobre os termos, a menos que você especifique uma string exata. Consulte Comportamento para ver detalhes.

$language

string

opcional. O idioma que determina as palavras vazias, stemmer e tokenizador . O padrão é o idioma do índice. Para obter os idiomas suportados, consulte linguagens de query $text em implantações autogerenciadas.

Se você especificar um valor default_language de none, o índice de texto analisará cada palavra no campo, incluindo palavras vazias, e ignorará a derivação do sufixo.

$caseSensitive

booleano

opcional. Habilita a sensibilidade a maiúsculas e minúsculas. Padrão é false. Consulte Insensibilidade a maiúsculas e minúsculas.

$diacriticSensitive

booleano

opcional. Ativa a sensibilidade a diacríticos para índices de texto da versão 3 . O padrão é false. As versões anteriores do índice de texto são sempre sensíveis a diacríticos. Consulte Insensibilidade a diacríticos.

Por padrão, o $text não classifica resultados por pontuação. Consulte Pontuação de texto para obter detalhes sobre a classificação da pontuação.

  • Uma query pode especificar somente uma expressão $text.

  • $text não pode aparecer em expressões $nor.

  • $text não pode aparecer em expressões de query ou projeção $elemMatch.

  • Todas as $or cláusulas devem ser indexadas para usar $text.

  • Se uma query incluir uma expressão $text, não sera possível usar hint() para especificar o índice a ser utilizado na query.

  • Queries com $text não podem usar a classificação $natural.

  • Você não pode combinar a expressão $text, que exige um índice de texto especial, com um operador de consulta que exige um tipo diferente de índice especial. Por exemplo, você não pode combinar a expressão $text com o operador $near .

  • As visualizações não suportam $text.

  • A Stable API V1 não suporta $text para criação de índice.

Se estiver usando o operador $text na agregação, as restrições a seguir também se aplicam.

  • O estágio $match que inclui um $text deve ser o primeiro estágio no pipeline.

  • Um operador $text só pode ocorrer uma vez no estágio.

  • A expressão do operador $text não pode aparecer em expressões $or ou $not.

  • $text, por padrão, não retorna os documentos correspondentes na ordem das pontuações correspondentes. Para classificar por pontuação decrescente, use a expressão de agregação $meta no estágio $sort.

No campo $search, especifique as palavras que o MongoDB utiliza para query o índice de texto.

Observação

O campo $search é diferente do estágio de agregação $search do MongoDB Atlas. O estágio $search fornece pesquisa de texto completo e está disponível somente no MongoDB Atlas.

Para corresponder a uma string exata de várias palavras em vez de termos individuais, coloque a string entre aspas duplas (\"): como em:

"\"ssl certificate\""

Se a string $search de uma operação $text incluir uma string de várias palavras e termos individuais, $text corresponderá somente aos documentos que incluem a string de várias palavras.

Por exemplo, esta string $search retorna documentos com a string exata "ssl certificate":

"\"ssl certificate\" authority key"

Prefixe uma palavra com um hífen/sinal de menos (-) para nega-la:

  • As palavras negadas excluem documentos que contêm a palavra negada do conjunto de resultados.

  • Uma string com apenas palavras negadas não corresponde a nenhum documento.

  • Palavras hifenizadas como pre-market não são negações. O MongoDB trata o hífen como um delimitador. Para negar market, use pre -market.

O MongoDB aplica todas as negações à operação com AND lógico.

O MongoDB ignora palavras vazias específicas da linguagem, como the e and em inglês.

Com insensibilidade a maiúsculas e minúsculas e diacríticos, $text corresponde à palavra derivada completa. Se um campo de documento contiver blueberry, um termo $search de blue não corresponderá. No entanto, blueberry ou blueberries correspondem.

Com a sensibilidade a maiúsculas e minúsculas ativada ($caseSensitive: true), se a base do sufixo contiver letras maiúsculas, $text corresponderá à palavra exata.

Com a sensibilidade a diacríticos ativada ($diacriticSensitive: true), se a base do sufixo contiver marcas diacríticas, $text corresponderá à palavra exata.

$text padroniza para a insensibilidade a maiúsculas e minúsculas do índice de texto:

  • O índice de texto 3 é não diferencia maiúsculas de minúsculas para caracteres latinos com ou sem diacríticos e alfabetos não latinos, como o cirílico.

  • As versões anteriores não diferenciam maiúsculas de minúsculas para caracteres latinos sem diacríticos ([A-z]).

Especifique $caseSensitive: true para ativar a sensibilidade a maiúsculas e minúsculas quando o índice de texto não for sensível a maiúsculas e minúsculas.

Quando $caseSensitive: true e o índice de texto não diferencia maiúsculas de minúsculas, $text:

  • Executa queries no índice de texto para correspondências insensíveis a maiúsculas e minúsculas e insensíveis a diacríticos.

  • Filtra os resultados para retornar apenas documentos que correspondam ao caso especificado.

Quando $caseSensitive: true e a base do sufixo contêm letras maiúsculas, $text corresponde à palavra exata.

Habilitar o $caseSensitive: true pode reduzir o desempenho.

$text O padrão é a insensibilidade a diacríticos do índice de texto:

  • Versão 3 índice de texto é insensível a diacríticos. O índice não faz distinção entre caracteres com diacríticos e suas contrapartes sem sinais (é, ê, e).

  • As versões anteriores são sensíveis a diacríticos.

Especifique $diacriticSensitive: true para habilitar a sensibilidade a diacríticos com índices de texto versão 3.

As versões anteriores do índice de texto são sempre sensíveis a diacríticos, portanto, $diacriticSensitive não tem efeito.

Com índices de texto da versão 3 e $diacriticSensitive: true, $text:

  • Consulta o índice de texto insensível a diacríticos.

  • Filtra os resultados para retornar somente documentos que correspondam às marcas diacríticas nos termos especificados.

Habilitar o $diacriticSensitive: true pode reduzir o desempenho.

Com versões anteriores do índice de texto, o $diacriticSensitive: true executa queries do índice de texto já sensível a diacríticos.

Quando $diacriticSensitive: true e a base do sufixo contêm sinais diacríticas, $text corresponde à palavra exata.

Dica

O operador $text atribui uma pontuação a cada documento de resultado. A pontuação representa a relevância de um documento para uma determinada query. A pontuação pode ser parte de uma especificação de método sort(), bem como parte da expressão de projeção. A expressão { $meta: "textScore" } apresenta informações sobre o processamento da operação $text. Consulte o operador de projeção $meta para obter detalhes sobre como acessar a pontuação para projeção ou classificação.

Alterado na versão 8.3.

A partir do MongoDB 8.3, o mecanismo de query limita o uso de memória do estágio TextOr a 100 megabytes. O estágio TextOr processa queries$text que leem metadados de pontuação de text. Por exemplo, TextOr processa queries que classificam resultados por pontuação de texto. Se o estágio TextOr exceder este limite:

  • Se allowDiskUse for true, o estágio transmitirá resultados intermediários para o disco.

  • Se allowDiskUse for false, a query falha com um erro de limite de memória excedido.

Em versões anteriores, o estágio TextOr não tinha limite de memória e consumia RAM sem restrições, arriscando erros de falta de memória (OOM).

Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.

Os exemplos pressupõem um índice de 3 texto versão title nos fullplot campos e:

db.movies.createIndex( { title: "text", fullplot: "text" } )

Este exemplo especifica baseball na string $search. A query retorna documentos contendo a versão derivada de baseball nos campos title ou fullplot indexados:

db.movies.find(
{ $text: { $search: "baseball" }, runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1 }
)
[ { title: 'Baseball', year: 1994, runtime: 1140 } ]

Uma string $search delimitada por espaço executa um OR lógico em cada termo. O MongoDB retorna documentos contendo qualquer um dos termos.

Este exemplo especifica dois termos delimitados por espaço. A query retorna documentos contendo as versões derivadas de baseball ou colorado nos title fullplot campos ou indexados:

db.movies.find(
{ $text: { $search: "baseball colorado" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 }
)
[
{
runtime: 1140,
title: 'Baseball',
fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.',
year: 1994
},
{
runtime: 1256,
title: 'Centennial',
fullplot: 'This is the story of the evolution of the town Centennial, Colorado. It follows the paths of dozens of people who come to the area for many reasons: money, freedom, or crime. It also shows the bigoted treatment of the Native Indians by the advancing US colonists. It is topped off with a murder mystery that takes 100 years to solve.',
year: 1978
}
]

Evite as aspas para corresponder a uma string exata de várias palavras.

Este exemplo corresponde à frase exata ken burns:

db.movies.find(
{ $text: { $search: "\"ken burns\"" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 }
)
[
{
runtime: 1140,
title: 'Baseball',
fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.',
year: 1994
}
]

Este exemplo executa um OR lógico de duas strings exatas:

db.movies.find(
{ $text: { $search: "\'ken burns\' \'centennial\'" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1, fullplot: 1 }
)
[
{
runtime: 1140,
title: 'Baseball',
fullplot: 'Ken Burns relates the history of baseball in a fashion similar to that of his Civil War mini series. Old-time photos and illustrations depict the games early years, while newsreels and video clips highlight more recent developments. Players and participants speak in their own words, and sports writers and broadcasters offer commentary on the sport and events they witnessed.',
year: 1994
},
{
runtime: 1256,
title: 'Centennial',
fullplot: 'This is the story of the evolution of the town Centennial, Colorado. It follows the paths of dozens of people who come to the area for many reasons: money, freedom, or crime. It also shows the bigoted treatment of the Native Indians by the advancing US colonists. It is topped off with a murder mystery that takes 100 years to solve.',
year: 1978
}
]

Prefixe um termo com - para excluir documentos que contenham esse termo.

Este exemplo corresponde a documentos contendo baseball ou colorado, mas não sport (versões derivadas):

db.movies.find(
{ $text: { $search: "baseball colorado -sport" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1, runtime: 1 }
)
[ { title: 'Centennial', year: 1978, runtime: 1256 } ]

Este exemplo faz query para baseball e usa para acrescentar a pontuação de relevância a cada documento correspondente. O documento retornado inclui $meta um score campo com a pontuação de relevância:

db.movies.find(
{ $text: { $search: "baseball" }, runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1,
score: { $meta: "textScore" } }
)
[
{
title: 'Baseball',
year: 1994,
score: ...
}
]

Use limit() com sort() para retornar os principais documentos correspondentes.

Este exemplo consulta baseball coloradoou, classifica por pontuação decrescente e limita os resultados aos dois principais documentos:

db.movies.find(
{ $text: { $search: "baseball colorado" },
runtime: { $gt: 1000 } },
{ _id: 0, title: 1, year: 1,
score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ).limit(2)
[
{ title: 'Baseball', year: 1994, score: ... },
{ title: 'Centennial', year: 1978, score: ... }
]

Este exemplo corresponde a documentos em que runtime é maior que 1000 e os campos indexados contêm baseball ou colorado. Ela classifica year crescente e, em seguida, pontuação de relevância decrescente:

db.movies.find(
{ runtime: { $gt: 1000 },
$text: { $search: "baseball colorado" } },
{ _id: 0, title: 1, year: 1,
score: { $meta: "textScore" } }
).sort( { year: 1, score: { $meta: "textScore" } } )
[
{ title: 'Centennial', year: 1978, score: ... },
{ title: 'Baseball', year: 1994, score: ... }
]

O restante dos exemplos nesta página usa uma articles collection com um índice de texto 3 versão subject em:

db.articles.createIndex( { subject: "text" } )

A collection contém os seguintes documentos:

db.articles.insertMany( [
{ _id: 1, subject: "coffee", author: "xyz", views: 50 },
{ _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
{ _id: 3, subject: "Baking a cake", author: "abc", views: 90 },
{ _id: 4, subject: "baking", author: "xyz", views: 100 },
{ _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
{ _id: 6, subject: "Сырники", author: "jkl", views: 80 },
{ _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
{ _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
] )

Use $language para especificar o idioma que determina as regras de palavras vazias, derivações e tokenizador para a string $search.

Se você especificar um valor default_language de none, o índice de texto analisará cada palavra no campo, incluindo palavras vazias, e ignorará a derivação do sufixo.

Este exemplo especifica es (espangal) como o idioma:

db.articles.find(
{ $text: { $search: "leche", $language: "es" } }
)
[
{ _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 },
{ _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 }
]

Você também pode especificar idiomas por nome, como spanish. Consulte Linguagens de Query $text em Implantações Autogerenciadas para obter os idiomas suportados.

Você pode especificar a expressão { $meta: "textScore" } no sort() sem especificar também a expressão na projeção. Por exemplo:

db.articles.find(
{ $text: { $search: "cake" } }
).sort( { score: { $meta: "textScore" } } )

Como resultado, você pode ordenar os documentos resultantes por sua relevância sem projetar o textScore.

Se você incluir a { $meta: "textScore" } expressão na projeção sort()e, os documentos de projeção e classificação poderão ter nomes de campo diferentes para a expressão. Por exemplo, na operação a seguir, a projeção usa um campo chamado score para a expressão , e o usa o sort() campo ignoredName chamado:

db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
).sort( { ignoredName: { $meta: "textScore" } } )

$text O padrão é a insensibilidade a maiúsculas e minúsculas do índice de texto. Os índices de texto da versão 3 são insensíveis a diacríticos e maiúsculas de minúsculas para caracteres latinos com diacríticos e alfabetos não latinos, como o cirílico. Consulte Insensibilidade a maiúsculas e minúsculas do índice de texto e Insensibilidade a diacríticos do índice de texto.

Este exemplo executa uma query sem distinção entre maiúsculas e minúsculas e diacríticos. Usando índices de texto 3, a query corresponde a documentos que contêm as versões derivadas dos termos de pesquisa:

db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )
[
{ _id: 6, subject: 'Сырники', author: 'jkl', views: 80 },
{ _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 },
{ _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 }
]

As versões anteriores do índice de texto não correspondiam a nenhum documento.

Habilite a sensibilidade a maiúsculas e minúsculas com $caseSensitive: true. Isso pode reduzir o desempenho.

Este exemplo executa uma query que diferencia maiúsculas de minúsculas para Coffee:

db.articles.find(
{ $text: { $search: "Coffee", $caseSensitive: true } }
)
[ { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]

Este exemplo executa uma query com distinção entre maiúsculas e minúsculas para uma string exata com várias palavras:

db.articles.find( {
$text: { $search: "\"Café Con Leche\"", $caseSensitive: true }
} )
[ { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 } ]

Você pode usar a sensibilidade a maiúsculas e minúsculas com termos negados (termos prefixados com -).

Este exemplo executa uma query que diferencia maiúsculas de minúsculas para documentos que contêm Coffee, mas não shop (versões derivadas):

db.articles.find(
{ $text: { $search: "Coffee -shop", $caseSensitive: true } }
)
[ { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]

Ative a sensibilidade a diacríticos com índices de texto da versão 3 text usando $diacriticSensitive: true. Isso pode reduzir o desempenho.

Este exemplo executa uma query sensível a diacríticos para CAFÉ (versão derivada):

db.articles.find(
{ $text: { $search: "CAFÉ", $diacriticSensitive: true } }
)
[ { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 } ]

Você pode usar a sensibilidade a diacríticos com termos negados (termos prefixados com -).

Este exemplo executa uma query sensível a diacríticos para documentos que contêm leches, mas não cafés (versões derivadas):

db.articles.find(
{ $text: { $search: "leches -cafés", $diacriticSensitive: true } }
)
[ { _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 } ]

Voltar

Operadores de query $text

Nesta página