Overview
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
Datos de muestra para ejemplos
Los ejemplos en 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 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?;
Consulta de texto
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>" } };
Buscar un término
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.
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 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.
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 agregas comillas escapadas alrededor de la frase, la búsqueda realiza una búsqueda de términos.
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 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.
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 de 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 secciones siguientes demuestran cómo realizar consultas de texto utilizando pipelines 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 de 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 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:
Í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, vea la siguiente documentación de la API: