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.
Definição
$text$textexecuta uma query de texto em campos indexados com um índice de texto.
Compatibilidade
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
Sintaxe
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 |
|---|---|---|
| string | Uma string de termos que o MongoDB analisa e usa para query o índice de texto. O MongoDB realiza uma query |
| 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 |
| booleano | opcional. Habilita a sensibilidade a maiúsculas e minúsculas. Padrão é |
| booleano | opcional. Ativa a sensibilidade a diacríticos para índices de texto da versão 3 . O padrão é |
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.
Comportamento
Restrições
Uma query pode especificar somente uma expressão
$text.$textnão pode aparecer em expressões$nor.$textnão pode aparecer em expressões de query ou projeção$elemMatch.Todas as
$orcláusulas devem ser indexadas para usar$text.Se uma query incluir uma expressão
$text, não sera possível usarhint()para especificar o índice a ser utilizado na query.Queries com
$textnã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$textcom o operador$near.As visualizações não suportam
$text.A Stable API V1 não suporta
$textpara 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
$matchque inclui um$textdeve ser o primeiro estágio no pipeline.Um operador
$textsó pode ocorrer uma vez no estágio.A expressão do operador
$textnão pode aparecer em expressões$orou$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$metano estágio$sort.
$search Campo
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.
Strings exatas
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"
Negações
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-marketnão são negações. O MongoDB trata o hífen como um delimitador. Para negarmarket, usepre -market.
O MongoDB aplica todas as negações à operação com AND lógico.
Operação de correspondência
Palavras vazias
O MongoDB ignora palavras vazias específicas da linguagem, como the e and em inglês.
Palavras derivadas
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.
Sensibilidade a maiúsculas e minúsculas e palavras com haste
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.
Sensibilidade a diacríticos e palavras derivadas
Com a sensibilidade a diacríticos ativada ($diacriticSensitive: true), se a base do sufixo contiver marcas diacríticas, $text corresponderá à palavra exata.
Insensibilidade a maiúsculas e minúsculas
$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]).
Habilitando a sensibilidade a maiúsculas e minúsculas
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.
Processo com diferenciação entre 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.
Insensibilidade a diacríticos
$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.
Habilitando a sensibilidade 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.
Processo de diferenciação de diacríticos
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.
Pontuação de texto
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.
Limites de memória
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
allowDiskUsefortrue, o estágio transmitirá resultados intermediários para o disco.Se
allowDiskUseforfalse, 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).
Exemplos
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" } )
Pesquisar uma única palavra
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 } ]
Corresponder a qualquer termo de pesquisa
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 } ]
Pesquisar uma string exata
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 } ]
Excluir documentos que contenham um termo
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 } ]
Exemplos de pontuação de relevância
Retornar à Pontuação de Relevância
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: ... } ]
Retornar os 2 principais documentos correspondentes
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: ... } ]
Combinar $text com outras operações de query e classificação
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: ... } ]
Consultar um idioma diferente
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.
Classificar por pontuação de relevância
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" } } )
Não diferenciação entre maiúsculas e minúsculas e diacríticos
$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.
Diferenciação entre maiúsculas e minúsculas
Habilite a sensibilidade a maiúsculas e minúsculas com $caseSensitive: true. Isso pode reduzir o desempenho.
Pesquisa de termos com distinção entre maiúsculas e minúsculas
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 } ]
Pesquisa de string exata sensível a maiúsculas e minúsculas
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 } ]
Pesquisa de termo negado sensível a maiúsculas e minúsculas
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 } ]
Sensibilidade a diacríticos
Ative a sensibilidade a diacríticos com índices de texto da versão 3 text usando $diacriticSensitive: true. Isso pode reduzir o desempenho.
Pesquisa de termos sensíveis a diacríticos
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 } ]
Pesquisa de termo negado sensível a diacríticos
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 } ]