Menu Docs

Página inicial do DocsGo

Texto de pesquisa

Nesta página

  • Visão geral
  • Dados de amostra
  • Text Index
  • Pesquisa de texto
  • Pesquisar por um termo
  • Pesquisar por frase
  • Pesquisar com Termos Excluídos
  • Classificar por relevância
  • Agregação
  • Exemplo de pesquisa de termo
  • Exemplo de pontuação de texto
  • Informações adicionais
  • Documentação da API

Neste guia, veja como executar umapesquisa de texto .

Importante

A pesquisa de texto do MongoDB é diferente da Atlas Search.

Para executar os exemplos neste guia, carregue os dados de amostra na collection marvel.movies com o seguinte trecho:

coll := client.Database("marvel").Collection("movies")
docs := []interface{}{
bson.D{{"title", "Captain America: Civil War"}, {"year", 2016}},
bson.D{{"title", "The Avengers"}, {"year", 2012}},
bson.D{{"title", "Captain America: The Winter Soldier"}, {"year", 2014}},
bson.D{{"title", "Avengers: Infinity War"}, {"year", 2018}},
bson.D{{"title", "Captain America: The First Avenger"}, {"year", 2011}},
}
result, err := coll.InsertMany(context.TODO(), docs)
if err != nil {
panic(err)
}
fmt.Printf("Number of documents inserted: %d\n", len(result.InsertedIDs))

Dica

Bancos de Dados e Coleções Inexistentes

Se o banco de dados e a collection necessários não existirem quando você executar uma operação de escrita, o servidor implicitamente os criará.

Cada documento contém o nome e o ano de lançamento do filme da Márvel que corresponde aos campos title e year .

Observação

Cada exemplo trunca o valor ObjectID porque o driver o gera exclusivamente.

Você deve criar um índice de texto antes de executar uma pesquisa de texto. Um índice de texto especifica a string ou o campo de array de strings no qual executar uma pesquisa de texto.

Os exemplos nas seções seguintes executam pesquisas de texto no campo title na coleção movies . Para habilitar pesquisas de texto no campo title , crie um índice de texto com o seguinte trecho:

model := mongo.IndexModel{Keys: bson.D{{"title", "text"}}}
name, err := coll.Indexes().CreateOne(context.TODO(), model)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)

Uma pesquisa de texto recupera documentos que contêm um termo ou uma frase nos campos indexados de texto. Um termo é uma sequência de caracteres que exclui caracteres de espaços em branco. Uma frase é uma sequência de termos com qualquer número de caracteres do espaço em branco.

Para executar uma pesquisa de texto, use o operador de query de avaliação do $text, seguido pelo campo $search em seu filtro de query. O operador $text executa uma pesquisa de texto nos campos indexados de texto. O campo $search especifica o texto para pesquisar nos campos indexados de texto.

Filtros de query para pesquisas de texto usam o seguinte formato:

filter := bson.D{{"$text", bson.D{{"$search", "<text to search>"}}}}

Para pesquisar um termo, especifique o termo como uma string em seu filtro de query. Para pesquisar vários termos, separe cada termo com espaços na string.

Observação

Ao pesquisar vários termos, o método Find() retorna documentos com pelo menos um dos termos em campos indexados por texto.

O exemplo abaixo executa uma pesquisa de texto para títulos que contenham o termo "War":

filter := bson.D{{"$text", bson.D{{"$search", "War"}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

Para pesquisar uma frase, especifique a frase com aspas escapadas como uma string em seu filtro de query. Se você não adicionar aspas escapadas ao redor da frase, o método Find() executará uma pesquisa de termo .

Dica

As aspas escapadas são um caractere de barra invertida seguido por um caractere de aspas duplas.

O exemplo abaixo executa uma pesquisa de texto para títulos que contenham a frase "Infinity Write":

filter := bson.D{{"$text", bson.D{{"$search", "\"Infinity War\""}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

Para cada termo ou frase que você deseja excluir da pesquisa de texto, especifique o termo ou frase prefixada com um sinal de subtração como uma string no filtro de query.

Importante

Você deve pesquisar pelo menos um termo se quiser excluí-los da sua pesquisa. Se você não pesquisar nenhum termo, o método Find() não retornará nenhum documento.

O exemplo a seguir executa uma pesquisa de texto para títulos que contenham o termo "Avenger", mas não contenham a frase "Captain América":

filter := bson.D{{"$text", bson.D{{"$search", "Avenger -\"Captain America\""}}}}
cursor, err := coll.Find(context.TODO(), filter)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

Uma pesquisa de texto atribui uma pontuação numérica de texto para indicar até que ponto cada resultado corresponde à string em seu filtro de query. Para revelar a pontuação de texto em sua saída, utilize uma projeção para recuperar os metadados do textScore. Você pode classificar a pontuação do texto em ordem decrescente especificando uma classificação nos metadados do textScore.

O exemplo a seguir executa as seguintes ações:

  • Executa uma pesquisa de texto para títulos que contenham o termo "Avenger"

  • Classifica os resultados em ordem decrescente com base em sua pontuação de texto

  • Inclui os campos title e score dos resultados

filter := bson.D{{"$text", bson.D{{"$search", "Avenger"}}}}
sort := bson.D{{"score", bson.D{{"$meta", "textScore"}}}}
projection := bson.D{{"title", 1}, {"score", bson.D{{"$meta", "textScore"}}}, {"_id", 0}}
opts := options.Find().SetSort(sort).SetProjection(projection)
cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

Dica

Embora o termo de pesquisa fosse "Avenger", o método também corresponde a títulos contendo "Avengers" porque um índice de texto do MongoDB usa sufixo derivada para corresponder a palavras semelhantes. Para saber mais sobre como o MongoDB corresponde aos termos, consulte Entradas de índice.

Você também pode incluir o operador de query de avaliação do $text no estágio $match para executar uma pesquisa de texto em um pipeline de agregação.

O exemplo abaixo executa uma pesquisa de texto para títulos que contenham o termo "Winter":

matchStage := bson.D{{"$match", bson.D{{"$text", bson.D{{"$search", "Winter"}}}}}}
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage})
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

O exemplo a seguir executa as seguintes ações:

  • Executa uma pesquisa de texto para títulos que contenham o termo "Avenger"

  • Classifica os resultados em ordem decrescente com base em sua pontuação de texto

  • Inclui os campos title e score dos resultados

matchStage := bson.D{{"$match", bson.D{{"$text", bson.D{{"$search", "Avenger"}}}}}}
sortStage := bson.D{{"$sort", bson.D{{"score", bson.D{{ "$meta", "textScore" }}}}}}
projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"score", bson.D{{ "$meta", "textScore" }}}, {"_id", 0}}}}
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage, sortStage, projectStage})
if err != nil {
panic(err)
}
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}

Dica

Embora o termo de pesquisa fosse "Avenger", o método também corresponde a títulos contendo "Avengers" porque um índice de texto do MongoDB usa sufixo derivada para corresponder a palavras semelhantes. Para saber mais sobre como o MongoDB corresponde aos termos, consulte Entradas de índice.

Para saber mais sobre as operações mencionadas, consulte os seguintes guias:

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

←  Especifique quais campos retornarFique atento às mudanças →
Dê Feedback
© 2022 MongoDB, Inc.

Sobre

© 2022 MongoDB, Inc.