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

Texto de query

En esta guía puede aprender a utilizar el driver Rust para ejecutar una query de texto. Una query de texto te permite consultar de manera eficiente campos con valores de string.

Importante

Las consultas de texto de MongoDB difieren de la función de búsqueda de MongoDB, que es más potente. Para obtener más información, consulte Documentación de MongoDB Search.

Esta guía incluye las siguientes secciones:

  • Datos de muestra para ejemplos presenta los datos de muestra que se utilizan en los ejemplos de consultas de texto

  • Índice de texto describe cómo crear un índice de texto en un campo de valor de cadena

  • Query de texto describe cómo realizar queries de texto con diferentes criterios de búsqueda

  • Aggregación describe cómo realizar consultas de texto utilizando pipelines de agregación

  • Información adicional proporciona enlaces a recursos y documentación de la API para los tipos y métodos mencionados en esta guía

Los ejemplos en esta guía utilizan lo siguiente Dish Estructura como modelo para los documentos de la colección menu:

#[derive(Serialize, Deserialize, Debug)]
struct Dish {
name: String,
description: String,
}

Los ejemplos usan los siguientes documentos de muestra que describen platos que puede pedir en un restaurante:

{ "name": "Shepherd’s Pie", "description": "A vegetarian take on the classic dish that uses lentils as a base. Serves 2." },
{ "name": "Green Curry", "description": "A flavorful Thai curry, made vegetarian with tofu. Vegetarian and vegan friendly." },
{ "name": "Herbed Branzino", "description": "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4." },
{ "name": "Kale Tabbouleh", "description": "A bright, herb-based salad. A perfect starter for vegetarians and vegans." },
{ "name": "Garlic Butter Trout", "description": "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2." }

Antes de realizar una text query, debe crear un índice de texto en la colección. Un índice de texto especifica el campo de string o arreglo de strings sobre el que se pueden realizar consultas de texto.

Los ejemplos de esta guía realizan consultas de texto en el campo description de los documentos en la colección menu. Para habilitar consultas de texto en el campo description, cree un índice de texto como se muestra en el siguiente código:

let index = IndexModel::builder()
.keys(doc! { "description": "text" })
.build();
let idx_res = my_coll.create_index(index).await?;

Una query de texto recupera documentos que contienen un término o frase especificado en el valor del campo indexado. 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 query de texto, incluya el operador del query de evaluación $text, seguido por el campo $search en su filtro de query. El operador $text indica que se está realizando una query de texto en los campos indexados por texto. El campo $search especifica el término o frase que se debe buscar en el campo o campos indexados por texto.

Los filtros para consultas de texto utilizan el siguiente formato:

let filter = doc! { "$text": { "$search": "<search term or phrase>" } };

Para buscar un término, especifica el término como una string en el filtro de query. Para buscar varios términos, sepárelos con un espacio.

Nota

Al buscar varios términos, el método find() devuelve cualquier documento en el que el o los campos indexados por texto contengan al menos uno de los términos.

Por ejemplo, si sus términos de búsqueda son "one two three", MongoDB retorna documentos en los que el campo indizado contiene "one", "two", "three" o más de uno de estos términos.

El siguiente ejemplo realiza una búsqueda de documentos en los que el campo description contiene el término "herb":

let filter = doc! { "$text": { "$search": "herb" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Kale Tabbouleh", description: "A bright, herb-based salad. A perfect starter for vegetarians and vegans." }
Dish { name: "Herbed Branzino", description: "Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4." }

Tip

Aunque el término de búsqueda es "herb", la query de texto también coincide con documentos en los que el campo description contiene "herbs". Esto se debe a que un índice de texto de MongoDB utiliza recortes de sufijación para emparejar palabras similares. Para obtener más información sobre cómo MongoDB hace coincidir los términos, consulta Entradas de índice en el manual del Servidor.

Para buscar una frase, especifique la frase entre comillas en su filtro de consulta:

let filter = doc! { "$text": { "$search": "\"<some phrase>\"" } };

Si no agregas comillas escapadas alrededor de la frase, la búsqueda realiza una búsqueda de términos.

El siguiente ejemplo realiza una búsqueda de documentos en los que el campo description contiene la frase "serves 2":

let filter = doc! { "$text": { "$search": "\"serves 2\"" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { name: "Shepherd's Pie", description: "A vegetarian take on the classic dish that uses lentils as a base. Serves 2." }
Dish { name: "Garlic Butter Trout", description: "Baked trout seasoned with garlic, lemon, dill, and, of course, butter. Serves 2." }

Para especificar un término o frase que desea excluir de su query de texto, antepóngale un signo menos en su filtro de query:

let filter = doc! { "$text": { "$search": "<term> -<excluded term>" } };

Importante

Debe buscar al menos un término o frase para excluir otros términos de su búsqueda. Si solo excluyes términos, la búsqueda no devuelve ningún documento.

El siguiente ejemplo realiza una búsqueda de documentos en los que el campo description contiene el término "vegan", pero no contiene el término "tofu":

let filter = doc! { "$text": { "$search": "vegan -tofu" } };
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Dish { 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. Una puntuación más alta indica que el resultado es más relevante para la consulta. Para mostrar la puntuación en la salida, utilice una proyección para recuperar el campo textScore de los metadatos. Puede ordenar la puntuación en orden descendente especificando una ordenación en el campo de metadatos textScore.

Este ejemplo realiza las siguientes acciones:

  • Realiza una búsqueda de documentos en los que el campo description contiene el término "vegetarian"

  • Ordena los resultados en orden descendente según la puntuación de texto

  • Incluye solo los campos name y score en la salida

let filter = doc! { "$text": { "$search": "vegetarian" } };
let sort = doc! { "score": { "$meta": "textScore" } };
let projection =
doc! {
"_id": 0,
"name": 1,
"score": { "$meta": "textScore" }
};
let doc_coll: Collection<Document> = my_coll.clone_with_type();
let mut cursor = doc_coll.find(filter)
.sort(sort)
.projection(projection)
.await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"name": String("Green Curry"), "score": Double(0.9166666666666667)})
Document({"name": String("Kale Tabbouleh"), "score": Double(0.5625)})
Document({"name": String("Shepherd’s Pie"), "score": Double(0.5555555555555556)})

Puede incluir el $text operador de consulta de evaluación en una etapa de agregación $match para realizar una consulta de texto en una canalización de agregación.

Las secciones siguientes demuestran cómo realizar consultas de texto utilizando pipelines de agregación en lugar del método find().

El siguiente ejemplo utiliza una agregación para realizar una búsqueda de documentos en los que el campo description contiene el término "herb":

let match_stage = doc! { "$match": { "$text": { "$search": "herb" } } };
let mut cursor = my_coll.aggregate([match_stage]).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"_id": ObjectId("..."), "name": String("Kale Tabbouleh"), "description": String("A bright, herb-based salad. A perfect starter for vegetarians and vegans.")})
Document({"_id": ObjectId("..."), "name": String("Herbed Branzino"), "description": String("Grilled whole fish stuffed with herbs and pomegranate seeds. Serves 3-4.")})

Este ejemplo utiliza una agregación para realizar las siguientes acciones:

  • Realiza una búsqueda de documentos en los que el campo description contiene el término "vegetarian"

  • Ordena los resultados en orden descendente según la puntuación de texto

  • Incluye solo los campos name y score en la salida

let match_stage = doc! { "$match": { "$text": { "$search": "vegetarian" } } };
let sort_stage = doc! { "$sort": { "score": { "$meta": "textScore" } } };
let proj_stage =
doc! { "$project": {
"_id": 0,
"name": 1,
"score": { "$meta": "textScore" }
} };
let pipeline = [match_stage, sort_stage, proj_stage];
let mut cursor = my_coll.aggregate(pipeline).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Document({"name": String("Green Curry"), "score": Double(0.9166666666666667)})
Document({"name": String("Kale Tabbouleh"), "score": Double(0.5625)})
Document({"name": String("Shepherd’s Pie"), "score": Double(0.5555555555555556)})

Para un ejemplo ejecutable que utiliza el método find(), consulta el encontrar varios documentos ejemplo de uso.

Para obtener más información sobre las operaciones de esta guía, consulte la siguiente documentación:

Para obtener más información sobre los métodos y tipos mencionados en esta guía, vea la siguiente documentación de la API:

Volver

Abrir Change Streams

En esta página