Overview
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:
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 con valor de cadena
Consulta de texto describe cómo realizar consultas de texto con diferentes criterios de búsqueda
Laagregación describe cómo realizar consultas de texto mediante canalizaciones de agregación.
Información adicional proporciona enlaces a recursos y documentación de API para los tipos y métodos mencionados en esta guía.
Datos de muestra para ejemplos
Los ejemplos de esta guía utilizan lo siguiente: Dish Estructura como modelo para los documentos de la colección menu:
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." }
Text Index
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?;
Consulta de texto
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>" } };
Buscar un término
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.
Ejemplo
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.
Buscar una frase
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.
Ejemplo
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." }
Excluir términos de la búsqueda
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.
Ejemplo
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." }
Ordenar por relevancia
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.
Ejemplo
Este ejemplo realiza las siguientes acciones:
Realiza una búsqueda de documentos en los que el campo
descriptioncontiene el término"vegetarian"Ordena los resultados en orden descendente según la puntuación del texto.
Incluye solo los campos
nameyscoreen 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)})
Agregación
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().
Coincidir con un término de búsqueda
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.")})
Ordenar por relevancia
Este ejemplo utiliza una agregación para realizar las siguientes acciones:
Realiza una búsqueda de documentos en los que el campo
descriptioncontiene el término"vegetarian"Ordena los resultados en orden descendente según la puntuación del texto.
Incluye solo los campos
nameyscoreen 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)})
Información Adicional
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:
Índices de texto en el manual del servidor
$texto en el manual del servidor
$meta en el manual del servidor
Documentación de la API
Para obtener más información sobre los métodos y tipos mencionados en esta guía, consulte la siguiente documentación de API: