Texto de pesquisa
Nesta página
Visão geral
Neste guia, você pode aprender como executar um texto Atlas Search.
Importante
A pesquisa de texto do MongoDB é diferente da Atlas Search.
Dados de amostra
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á.
Text Index
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)
Pesquisa de texto
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>"}}}}
Pesquisar por um termo
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.
Exemplo
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.
Pesquisar por frase
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.
Exemplo
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)) }
Pesquisar com Termos Excluídos
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.
Exemplo
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)) }
Classificar por relevância
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
.
Exemplo
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
escore
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)) }
Agregação
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.
Corresponder a um termo de pesquisa
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)) }
Classificar por relevância
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
escore
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)) }
Informações adicionais
Para saber mais sobre as operações mencionadas, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: