Visão geral
Neste guia, você pode aprender como executar uma consulta de texto no driver Java MongoDB .
Você pode usar uma query de texto para recuperar documentos que contenham um termo ou uma frase em um campo especificado. Um termo é uma sequência de caracteres que exclui caracteres de espaço em branco. Uma frase é uma sequência de termos com qualquer número de caracteres do espaço em branco.
As seções a seguir mostram como executar os seguintes tipos de queries de texto:
Texto de consulta por um termo
Texto de query por frase
Texto da query com termos excluídos
Se quiser classificar os resultados da consulta de texto, consulte a seção Query de texto do nosso guia Classificar resultados.
Documentos de amostra
As seções seguintes apresentam exemplos de queries de texto na coleção fast_and_furious_movies
. Cada seção usa uma variável chamada collection
para fazer referência à instância MongoCollection
da coleção fast_and_furious_movies
.
A coleção fast_and_furious_movies
contém documentos que descrevem um dos vários filmes que fazem parte da franquia de filmes Velozes e Furiosos. Cada documento contém um campo de título e um campo de tags.
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] } { "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
Text Index
Você deve criar um índice de texto antes de executar uma consulta de texto. Um índice de texto especifica a string ou o campo de array de strings no qual executar uma pesquisa de texto.
Nos exemplos seguintes, você executa consultas de texto no title
campo na fast_and_furious_movies
coleção . Para habilitar pesquisas de texto no title
campo, crie um índice de texto utilizando o construtor Índices com o seguinte trecho:
collection.createIndex(Indexes.text("title"));
Para obter mais informações, consulte os seguintes recursos:
Seção Índices de texto do nosso guia de índices
Índices de texto Entrada manual do servidor
Query de texto
Utilize o método Filters.text()
para especificar uma query de texto.
O Filters.text()
método utiliza o Construtor de Filtros para definir um filtro de consulta especificando o que procurar na consulta de texto. O filtro de consulta é representado por uma instância BSON. Passe o filtro de consulta para o find()
método para executar uma consulta de texto.
Ao executar o find()
método, MongoDB executa uma query de texto em todos os campos indexados com o índice de texto na coleção. O MongoDB retorna documentos que contêm um ou mais dos termos de pesquisa e uma pontuação de relevância para cada resultado. Para obter mais informações sobre pontuações de relevância, consulte a seção Query de texto em nosso guia Resultados de classificação.
Especifique as opções
Você pode incluir TextSearchOptions
como o segundo parâmetro do método Filters.text()
para especificar opções de query de texto como sensibilidade do caso. Por padrão, as queries de texto são executadas sem distinção entre maiúsculas e minúsculas, o que significa que a pesquisa corresponde a valores em minúsculas e maiúsculas.
Para especificar uma pesquisa sensível a maiúsculas e minúsculas, use o seguinte trecho:
TextSearchOptions options = new TextSearchOptions().caseSensitive(true); Bson filter = Filters.text("SomeText", options);
Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:
Pesquisar texto por um termo
Passe um termo como uma string para o método Filters.text()
para especificar o termo na sua consulta de texto.
Exemplo
O exemplo a seguir executa uma query de texto nos documentos na collection fast_and_furious_movies
para títulos que contêm o termo "fast":
Bson filter = Filters.text("fast"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
O seguinte mostra a saída do código anterior:
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] }
Para corresponder a vários termos em sua consulta de texto, separe cada termo com espaços no método de construtor do Filters.text()
. O método de construtor retorna a query de texto como uma instância Bson
. Quando você passa isso para o método find()
, ele retorna documentos que correspondem a qualquer um dos termos.
Exemplo
O exemplo a seguir executa uma query de texto nos documentos na collection fast_and_furious_movies
para títulos que contenham os termos "fate" ou "7":
Bson filter = Filters.text("fate 7"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
O seguinte mostra a saída do código anterior:
{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
Pesquisar texto por frase
Passe uma frase com citações em forma de escape para o Filters.text()
método para especificar a frase na sua consulta de texto. As aspas escapadas são caracteres de aspas duplas precedidos por um caractere de barra invertida. Se você não adicionar aspas escapadas ao redor da frase, o find()
método executará uma pesquisa de termo .
Exemplo
O exemplo a seguir executa uma query de texto nos documentos da collection fast_and_furious_movies
para títulos que contenham a frase "fate of the furious" (destino dos furiosos):
Bson filter = Filters.text("\"fate of the furious\""); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
O seguinte mostra a saída do código anterior:
{ "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
Pesquise por texto com termos excluídos
Para cada termo que você deseja excluir da consulta de texto, prefixe o termo com um sinal de subtração na string que você passa para o método construtor de Filters.text()
.
Nenhum dos documentos devolvidos da pesquisa contém o termo excluído no campo de índice de texto.
Importante
Você deve ter pelo menos um termo de query de texto se quiser excluir os termos da sua pesquisa.
Exemplo
O exemplo a seguir executa uma query de texto nos documentos na collection fast_and_furious_movies
para títulos que contêm o termo "fuzzy", mas não contêm o termo "fast":
Bson filter = Filters.text("furious -fast"); collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));
O seguinte mostra a saída do código anterior:
{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }