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

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)

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

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.

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.

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.

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

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.

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

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.

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

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 según 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 obtener más información 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