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 en 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 en esta guía, carga 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 el name y el description de un plato en el menú de un restaurante.
Tip
Bases de datos y colecciones inexistentes
Si la base de datos y la colección necesarias no existen cuando realizas una operación de guardar, el servidor las crea implícitamente.
Text Index
Debe crear un índice de texto antes de ejecutar una query de texto. Un índice de texto especifica el campo de string o arreglo de strings en el que se realiza una búsqueda de texto.
Los ejemplos de las siguientes secciones ejecutan consultas de query en el campo description de los documentos de la colección menu. Para habilitar queries de texto en el campo description, crea un índice de texto con el siguiente snippet:
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 un query de texto, utiliza el $text operador del query, seguido del campo $search en tu filtro de query. El operador $text realiza una query de texto en los campos de texto indexados. El campo $search especifica el texto a buscar en los campos indexados de texto.
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, especifica el término como un string en tu filtro de query. Para buscar varios términos, separa cada término con espacios en la string.
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 era "herb", el método también coincide con descripciones que contienen "herbs" porque un índice de texto MongoDB utiliza el recorte de sufijos para emparejar palabras similares. Para obtener más información sobre cómo MongoDB asigna los términos, consulta Entradas de índice.
Búsqueda por una 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 double.
Ejemplo
El siguiente ejemplo ejecuta una query de texto para descripciones que contienen la frase "sirve a 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."}
Buscar con términos excluidos
Para cada término o frase que desees excluir de tu query de texto, especifica el término o frase prefijado con un signo menos como una string en tu filtro de query.
Importante
Debe buscar al menos un término si desea excluir términos de su búsqueda. Si no se buscan términos, el método Find() no devuelve ningún documento.
Ejemplo
El siguiente ejemplo ejecuta una query de texto para descripciones que contienen el término "vegano" pero que 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 query de texto asigna una puntuación numérica de texto para indicar el grado de coincidencia de cada resultado con la string en tu filtro de query. Para revelar el puntaje de texto en tu salida, utiliza una proyección para recuperar los metadatos de textScore. Puede ordenar la puntuación de texto en orden descendente especificando un criterio de orden 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 en base a 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 puedes incluir el $text operador del query de evaluación en la etapa $match para realizar una query de texto en una pipeline 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 en base a 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 aprender más 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: