Menu Docs
Página inicial do Docs
/ / /
Go
/ / /

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
  • Corresponder a um termo de pesquisa
  • Classificar por relevância
  • Informações adicionais
  • Documentação da API

Neste guia, você pode aprender como executar um texto Atlas Search.

Importante

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

Os exemplos nesta aba usam o seguinte struct Dish como um modelo para documentos na coleção menu:

type Dish struct {
Name string
Description string
}

Para executar os exemplos nesta aba, carregue os dados de amostra na coleção db.menu com o seguinte trecho:

coll := client.Database("db").Collection("menu")
docs := []interface{}{
Dish{Name: "Shepherd’s Pie", Description: "A vegetarian take on the classic dish that uses lentils as a base. Serves 2."},
Dish{Name: "Green Curry", Description: "A flavorful Thai curry, made vegetarian with fried tofu. Vegetarian and vegan friendly."},
Dish{Name: "Herbed Whole Branzino", Description: "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4."},
Dish{Name: "Kale Tabbouleh", Description: "A bright, herb-based salad. A perfect starter for vegetarians and vegans."},
Dish{Name: "Garlic Butter Trout", Description: "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2."},
}
result, err := coll.InsertMany(context.TODO(), docs)

Cada documento contém o name e description de um prato no cardápio de um restaurante.

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á.

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 description de documentos na coleção menu. Para habilitar pesquisas de texto no campo description, crie um índice de texto com o seguinte trecho:

model := mongo.IndexModel{Keys: bson.D{{"description", "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 descrições que contêm o termo "herb":

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

Dica

Embora o termo de pesquisa fosse "erva", o método também corresponde a descrições contendo "ervas" 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 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 termos.

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 descrições que contêm a frase "serves 2":

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

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 descrições que contêm o termo "vegan", mas não contêm o termo "tofu":

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

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 descrições que contenham o termo "vegetariano"

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

  • Inclui apenas os campos name e score no documento de saída final

filter := bson.D{{"$text", bson.D{{"$search", "vegetarian"}}}}
sort := bson.D{{"score", bson.D{{"$meta", "textScore"}}}}
projection := bson.D{{"name", 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 {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}

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 descrições que contêm o termo "herb":

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

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

  • Executa uma pesquisa de texto para descrições que contenham o termo "vegetariano"

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

  • Inclui apenas os campos name e score no documento de saída final

matchStage := bson.D{{"$match", bson.D{{"$text", bson.D{{"$search", "vegetarian"}}}}}}
sortStage := bson.D{{"$sort", bson.D{{"score", bson.D{{ "$meta", "textScore" }}}}}}
projectStage := bson.D{{"$project", bson.D{{"name", 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 {
res, _ := bson.MarshalExtJSON(result, false, false)
fmt.Println(string(res))
}

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

  • Especificar uma query

  • Classificar resultados

  • Especifique quais campos retornar

  • Text Indexes

  • $text

  • $meta

  • Agregação

  • Indexes

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

Voltar

Especifique quais campos retornar