Overview
En esta guía, puedes aprender cómo ejecutar una query de texto.
Importante
La consulta de texto de MongoDB es diferente de Búsqueda en MongoDB.
Datos de muestra
Los ejemplos de esta guía utilizan lo siguiente: Dish Estructura como modelo para los documentos de la colección menu:
type Dish struct { Name string Description string }
Para ejecutar los ejemplos de esta guía, cargue los datos de muestra en la colección db.menu con el siguiente fragmento:
coll := client.Database("db").Collection("menu") docs := []any{ 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 contiene los name y description de un plato del menú de un restaurante.
Tip
Bases de datos y colecciones inexistentes
Si la base de datos y la colección necesarias no existen cuando realiza una operación de escritura, el servidor las crea implícitamente.
Text Index
Debe crear un índice de texto antes de ejecutar una consulta de texto. Un índice de texto especifica el campo de cadena o matriz de cadenas donde se ejecutará la búsqueda.
Los ejemplos de las siguientes secciones ejecutan consultas de texto en el campo description de los documentos de la colección menu. Para habilitar las consultas de texto en el campo description, cree un índice de texto con el siguiente fragmento:
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)
Consulta de texto
Una consulta de texto recupera documentos que contienen un término o una frase en los campos de texto indexados. Un término es una secuencia de caracteres que excluye los espacios en blanco. Una frase es una secuencia de términos con cualquier número de espacios en blanco.
Para realizar una consulta de texto, utilice el operador de consulta de evaluación $text, seguido del campo $search en su filtro de consulta. El operador $text realiza una consulta de texto en los campos de texto indexados. El campo $search especifica el texto que se buscará en dichos campos.
Los filtros de consulta para consultas de texto utilizan el siguiente formato:
filter := bson.D{{"$text", bson.D{{"$search", "<text to search>"}}}}
Buscar por un término
Para buscar un término, especifíquelo como una cadena en el filtro de consulta. Para buscar varios términos, sepárelos con espacios en la cadena.
Nota
Al buscar varios términos, el método Find() devuelve documentos con al menos uno de los términos en campos de texto indexados.
Ejemplo
El siguiente ejemplo ejecuta una consulta de texto para descripciones que contienen el término "hierba":
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)) }
{"name":"Kale Tabbouleh","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans."} {"name":"Herbed Whole Branzino","description":"Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4."}
Tip
Aunque el término de búsqueda fue "hierba", el método también encuentra descripciones que contienen "hierbas", ya que un índice de texto de MongoDB utiliza la lematización de sufijos para encontrar palabras similares. Para obtener más información sobre cómo MongoDB encuentra términos, consulte Entradas de índice.
Buscar por frase
Para buscar una frase, especifíquela con comillas escapadas como una string en el filtro de query. Si no se agregan comillas escapadas alrededor de la frase, el método Find() ejecuta una búsqueda de términos.
Tip
Las comillas escapadas son un carácter de barra invertida seguido de un carácter de comillas dobles.
Ejemplo
El siguiente ejemplo ejecuta una consulta de texto para descripciones que contienen la frase "sirve 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)) }
{"name":"Shepherd's Pie","description":"A vegetarian take on the classic dish that uses lentils as a base. Serves 2."} {"name":"Garlic Butter Trout","description":"Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2."}
Búsqueda con términos excluidos
Para cada término o frase que desee excluir de su consulta de texto, especifique el término o frase precedido por un signo menos como una cadena en su filtro de consulta.
Importante
Debe buscar al menos un término si desea excluir términos de su búsqueda. Si no busca ningún término, el método Find() no devuelve ningún documento.
Ejemplo
El siguiente ejemplo ejecuta una consulta de texto para descripciones que contienen el término "vegano", pero no contienen el término "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)) }
{"name":"Kale Tabbouleh","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans."}
Ordenar por relevancia
Una consulta de texto asigna una puntuación numérica para indicar la coincidencia de cada resultado con la cadena del filtro de consulta. Para mostrar la puntuación en la salida, utilice una proyección para recuperar los metadatos textScore. Puede ordenar la puntuación en orden descendente especificando una ordenación en los metadatos textScore.
Ejemplo
El siguiente ejemplo realiza las siguientes acciones:
Ejecuta una consulta de texto para descripciones que contienen el término "vegetariano".
Ordena los resultados en orden descendente según su puntuación de texto.
Incluye solo los campos
nameyscoreen el documento de salida 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)) }
{"name":"Green Curry","score":0.8999999999999999} {"name":"Kale Tabbouleh","score":0.5625} {"name":"Shepherd's Pie","score":0.5555555555555556}
Agregación
También puede incluir el $text operador de consulta de evaluación en la etapa $match para realizar una consulta de texto en una canalización de agregación.
Coincidir con un término de búsqueda
El siguiente ejemplo ejecuta una consulta de texto para descripciones que contienen el término "hierba":
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)) }
{"name":"Kale Tabbouleh","description":"A bright, herb-based salad. A perfect starter for vegetarians and vegans."} {"name":"Herbed Whole Branzino","description":"Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4."}
Ordenar por relevancia
El siguiente ejemplo realiza las siguientes acciones:
Ejecuta una consulta de texto para descripciones que contienen el término "vegetariano".
Ordena los resultados en orden descendente según su puntuación de texto.
Incluye solo los campos
nameyscoreen el documento de salida 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)) }
{"name":"Green Curry","score":0.8999999999999999} {"name":"Kale Tabbouleh","score":0.5625} {"name":"Shepherd's Pie","score":0.5555555555555556}
Información Adicional
Para obtener más información sobre las operaciones mencionadas, consulte las siguientes guías:
Documentación de la API
Para obtener más información sobre cualquiera de los métodos o tipos discutidos en esta guía, consultar la siguiente documentación de la API: