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.
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 sequência de termos que o MongoDB analisa e usa para consultar o índice de texto. O MongoDB realiza uma |
| 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 Idiomas de pesquisa de texto em implementaçõ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 3 índices de texto da versão. 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$elemMatchexpressões de query ou projeção.Todas as cláusulas devem ser indexadas
$orpara$textusar.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$naturalclassificação.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.AAPI estável V 1 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 $search campo, especifique as palavras que o MongoDB utiliza para consultar o índice de texto.
Observação
O $search campo é diferente do estágio de agregação $search do MongoDB Atlas . O $search estágio 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 do idioma, como the e and em inglês.
Palavras derivadas
Com insensibilidade a$text maiúsculas e minúsculas e diacríticos, corresponde à palavra derivada completa. Se um campo de documento blueberry contiver, um $search termo 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 3 índice de texto 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:
O índice de texto da versão é insensível a diacríticos. O índice não faz distinção entre caracteres com diacríticos e suas contrapartes 3
ésemêsinaise(,,).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.
Exemplos
Os seguintes exemplos utilizam uma articles coleção com um índice de 3 texto da versão subject no:
db.articles.createIndex( { subject: "text" } )
Preencha a collection com 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 } ] )
Pesquisar uma única palavra
Este exemplo especifica coffee na string $search:
db.articles.find( { $text: { $search: "coffee" } } )
Isso retorna documentos contendo a versão derivada de coffee no campo subject indexado :
{ _id: 1, subject: 'coffee', author: 'xyz', views: 50 }, { _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 }, { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 }
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 três termos delimitados por espaço:
db.articles.find( { $text: { $search: "bake coffee cake" } } )
Isso retorna documentos contendo as versões derivadas de bake ou coffee ou cake no subject campo indexado:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 } { "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 } { "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 } { "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90 } { "_id" : 4, "subject" : "baking", "author" : "xyz", "views" : 100 }
Pesquisar uma string exata
Evite as aspas para corresponder a uma string exata de várias palavras.
Este exemplo corresponde à string exata coffee shop:
db.articles.find( { $text: { $search: "\"coffee shop\"" } } )
Essa operação retorna documentos que contêm a string coffee shop:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg", "views" : 5 }
Este exemplo executa um OR lógico de duas strings exatas:
db.articles.find( { $text: { $search: "\'coffee shop\' \'Cafe con Leche\'" } } )
Isso retorna documentos contendo qualquer uma das strings, incluindo documentos com termos de ambas as strings:
[ { _id: 8, subject: 'Cafe con Leche', author: 'xyz', views: 10 }, { _id: 5, subject: 'Café Con Leche', author: 'abc', views: 200 }, { _id: 1, subject: 'coffee', author: 'xyz', views: 50 }, { _id: 7, subject: 'coffee and cream', author: 'efg', views: 10 }, { _id: 2, subject: 'Coffee Shopping', author: 'efg', views: 5 } ]
Dica
Excluir documentos que contenham um termo
Prefixe um termo com - para excluir documentos que contenham esse termo.
Este exemplo corresponde a documentos que contêm coffee, mas não shop (versões derivadas):
db.articles.find( { $text: { $search: "coffee -shop" } } )
A operação retorna os seguintes documentos:
{ "_id" : 7, "subject" : "coffee and cream", "author" : "efg", "views" : 10 } { "_id" : 1, "subject" : "coffee", "author" : "xyz", "views" : 50 }
Consultar um idioma diferente
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" } } )
O exemplo retorna os seguintes documentos:
{ "_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,spanish como. Consulte Idiomas de pesquisa de texto em sistemas autogerenciados para obter os idiomas suportados.
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 3 índices de texto da versão 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:
db.articles.find( { $text: { $search: "сы́рники CAFÉS" } } )
Usando índices de texto da versão 3, corresponde a:
{ "_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 } } )
Corresponde apenas a:
{ "_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 } } )
Corresponde apenas a:
{ "_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 } } )
Isso corresponde a:
{ "_id" : 2, "subject" : "Coffee Shopping", "author" : "efg" }
Sensibilidade a diacríticos
Ative a sensibilidade a diacríticos com 3 índices de texto da versão $diacriticSensitive: true usando. 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 } } )
Corresponde apenas a:
{ "_id" : 5, "subject" : "Café Con Leche", "author" : "abc" }
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 } } )
Isso corresponde a:
{ "_id" : 8, "subject" : "Cafe con Leche", "author" : "xyz" }
Exemplos de pontuação de relevância
Retornar à Pontuação de Relevância
Este exemplo faz query para cake e usa para acrescentar a pontuação de relevância a cada documento $meta correspondente:
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } )
O documento retornado inclui um campo score com a pontuação de relevância:
{ "_id" : 3, "subject" : "Baking a cake", "author" : "abc", "views" : 90, "score" : 0.75 }
Dica
Classificar por pontuação de relevância
Você pode especificar a expressão
{ $meta: "textScore" }nosort()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 expressão
{ $meta: "textScore" }na projeção esort(), os documentos de projeção e classificação poderão ter nomes de campo diferentes para a expressão.For example, in the following operation, the projection uses a field namedscorefor the expression and thesort()uses the field namedignoredName.db.articles.find( { $text: { $search: "cake" } } , { score: { $meta: "textScore" } } ).sort( { ignoredName: { $meta: "textScore" } } )
Dica
Retornar os 2 principais documentos correspondentes
Use limit() com para retornar os principais documentos sort() correspondentes.
Este exemplo consulta coffee, classifica por pontuação decrescente e limita os resultados aos dois principais documentos:
db.articles.find( { $text: { $search: "coffee" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } ).limit(2)
Dica
Combinar $text com outras operações de query e classificação
Este exemplo corresponde a documentos em que author é "xyz" e subject contém coffee ou bake. Ela classifica date crescente e, em seguida, pontuação de relevância decrescente:
db.articles.find( { author: "xyz", $text: { $search: "coffee bake" } }, { score: { $meta: "textScore" } } ).sort( { date: 1, score: { $meta: "textScore" } } )