Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Realizar una consulta de texto

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.

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.

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)

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>"}}}}

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.

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.

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.

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."}

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.

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."}

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.

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 name y score en 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}

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.

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."}

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 name y score en 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}

Para aprender más sobre las operaciones mencionadas, consulte las siguientes guías:

  • Especifica un query

  • Sort

  • Especifica qué campos se deben devolver

  • Text Indexes

  • $text

  • $meta

  • Agregación

  • Indexes

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:

Volver

Valores únicos de campo

En esta página