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

Búsqueda de texto

En esta guía, puedes aprender cómo ejecutar un búsqueda de texto.

Importante

La búsqueda de texto en MongoDB es diferente que MongoDB Search.

Los ejemplos en esta guía utilizan lo siguiente Dish struct como modelo para documentos en 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 := []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 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.

Debes crear un índice de texto antes de ejecutar una búsqueda 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 en las siguientes secciones realizan búsquedas de texto en el campo description de los documentos en la colección menu. Para habilitar búsquedas 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 búsqueda 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 caracteres de espacio en blanco. Una frase es una secuencia de términos con cualquier número de caracteres de espacio en blanco.

Para realizar una búsqueda de texto, usa el operador del query $text, seguido del campo $search en tu filtro de query. El operador $text realiza una búsqueda de texto en los campos indexados de texto. El campo $search especifica el texto a buscar en los campos indexados de texto.

Los filtros de query para búsquedas 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 búsqueda de texto para descripciones que contengan el término "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))
}
{"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 búsqueda de texto para descripciones que contienen la frase "sirve para 2 personas":

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 búsqueda de texto, especifique el término o frase precedido de un signo menos como una string en su 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 búsqueda de texto de 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 búsqueda de texto asigna una puntuación numérica de texto para indicar qué tan exactamente cada resultado coincide con la string en tu filtro de query. Para mostrar la puntuación de texto en tu resultado, utiliza una proyección para recuperar los metadatos textScore. Puede ordenar la puntuación del texto en orden descendente especificando un criterio de clasificación en los metadatos textScore.

El siguiente ejemplo realiza las siguientes acciones:

  • Ejecuta una búsqueda de texto para descripciones que contengan el término “vegetariano”

  • Ordena los resultados en orden descendente en base a su puntuación de texto

  • Incluye solamente 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 del query de evaluación en la etapa $match para realizar una búsqueda de texto en una pipeline de agregación.

El siguiente ejemplo ejecuta una búsqueda de texto para descripciones que contengan el término "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))
}
{"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 búsqueda de texto para descripciones que contengan el término “vegetariano”

  • Ordena los resultados en orden descendente en base a su puntuación de texto

  • Incluye solamente 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

  • Ordenar resultados

  • 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

Especifique los campos a devolver

En esta página