Docs Menu
Docs Home
/ /

Texto de query

En esta guía, aprenderá a usar el controlador de Rust para ejecutar una consulta de texto. Una consulta de texto le permite consultar campos con valores de cadena de forma eficiente.

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 búsqueda de MongoDB.

Esta guía incluye las siguientes secciones:

Los ejemplos de 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 consulta de texto, debe crear un índice de texto en la colección. Un índice de texto especifica el campo de cadena o matriz de cadenas en 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 de la colección menu. Para habilitar las 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 consulta de texto recupera documentos que contienen un término o frase específico en el valor del campo indexado. 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, incluya el operador de consulta de evaluación $text, seguido del campo $search en su filtro de consulta. El operador $text especifica que está realizando una consulta de texto en los campos indexados. El campo $search especifica el término o la frase que se buscará en los campos indexados.

Los filtros para consultas de texto utilizan el siguiente formato:

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

Para buscar un término, especifíquelo como una cadena en el filtro de consulta. 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 campo o los campos indexados en texto contengan al menos uno de los términos.

Por ejemplo, si sus términos de búsqueda son "one two three", MongoDB devuelve documentos en los que el campo indexado 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 "herb" de búsqueda sea, la consulta de texto también encuentra documentos cuyo description campo "herbs" contenga. Esto se debe a 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 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 agrega comillas escapadas alrededor de la frase, la búsqueda realiza una búsqueda de término.

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 consulta de texto, antepóngalo con un signo menos en su filtro de consulta:

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 del 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 siguientes secciones demuestran cómo realizar consultas de texto mediante canalizaciones 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 del 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 ver un ejemplo ejecutable que utiliza el método find(), consulte Ejemplo de uso deBuscar varios documentos.

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, consulte la siguiente documentación de API:

Volver

Flujos de cambio abiertos

En esta página