Overview
在本指南中,您可以学习;了解如何使用Rust驾驶员对集合运行 Atlas Search查询。 Atlas Search使您能够对MongoDB Atlas上托管的集合执行全文搜索。 Atlas Search索引指定搜索行为以及要索引的字段。
样本数据
本指南中的示例使用来自 Atlas 示例数据集的 sample_mflix 数据库中的 movies 集合。要了解如何创建免费的 MongoDB Atlas 集群并加载示例数据集,请参阅Atlas 入门指南。
运行 Atlas Search 查询
本节将介绍如何创建聚合管道以在集合上运行 Atlas Search 查询。
要运行Atlas Search查询,您必须在集合上创建Atlas Search索引。要学习;了解如何以编程方式创建Atlas Search索引,请参阅索引指南中的 Atlas Search和 Vector Search 索引部分。您可以将本指南代码示例中的<search index name> 占位符替换为Atlas Search索引的名称。
创建Atlas Search索引后,在管道阶段大量中添加 $search 阶段以指定搜索条件。然后,调用 aggregate() 方法并将管道大量作为参数传递。
提示
要学习;了解有关聚合操作的更多信息,请参阅 聚合指南。
Atlas Search 示例
此示例通过执行以下操作来运行Atlas Search查询:
创建一个
$search阶段,指示驾驶员查询title字段包含单词"Alabama"的文档创建一个
$project阶段,指示驱动程序在查询结果中包含title字段将管道阶段传递到
aggregate()方法并打印结果
use mongodb::{ bson::{doc, Document}, Client, Collection, }; use futures::stream::TryStreamExt; async fn main() -> mongodb::error::Result<()> { // Replace the uri string with your connection string let uri = "<connection string uri>"; let client = Client::with_uri_str(uri).await?; let my_coll: Collection<Document> = client .database("sample_mflix") .collection("movies"); // Defines the Atlas Search query let pipeline = vec![ doc! { "$search": { "index": "<search index name>", "text": { "query": "Alabama", "path": "title" } } }, doc! { "$project": { "title": 1, "_id": 1 } } ]; // Runs the aggregation pipeline let mut cursor = my_coll.aggregate(pipeline).await?; // Prints the results while let Some(doc) = cursor.try_next().await? { println!("{}", doc); } Ok(()) }
{ "_id": ObjectId("..."), "title": "Alabama Moon" } { "_id": ObjectId("..."), "title": "Crazy in Alabama" } { "_id": ObjectId("..."), "title": "Sweet Home Alabama" }
Atlas Search 元数据
使用$searchMeta 管道阶段创建 $searchMeta聚合阶段,该阶段仅返回Atlas Search结果中的元数据。
以下示例展示了如何检索Atlas Search聚合阶段的元数据:
use mongodb::{ bson::{doc, Document, DateTime}, Client, Collection, }; use futures::stream::TryStreamExt; async fn main() -> mongodb::error::Result<()> { // Replace the uri string with your connection string let uri = "<connection string uri>"; let client = Client::with_uri_str(uri).await?; let my_coll: Collection<Document> = client .database("sample_mflix") .collection("movies"); // Defines the $searchMeta pipeline stage let pipeline = vec![ doc! { "$searchMeta": { "index": "<search index name>", "near": { "path": "released", "origin": DateTime::parse_rfc3339_str("2011-09-01T00:00:00.000Z") .unwrap(), "pivot": 7776000000i64 } } } ]; let mut cursor = my_coll.aggregate(pipeline).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); } Ok(()) }
{ "count": 3, "hits": [ { "id": ObjectId("..."), "score": 1.0 }, { "id": ObjectId("..."), "score": 1.0 }, { "id": ObjectId("..."), "score": 1.0 } ] }
创建管道搜索阶段
MongoDB Rust驾驶员提供了用于创建Atlas Search管道阶段的辅助方法和构建者。这些助手允许您使用 Rust 的类型系统构造复杂的搜索,从而提高编译时安全性。
Atlas Search 操作符
Rust驾驶员通过BSON文档构造支持以下Atlas Search操作符:
Operator | 说明 |
|---|---|
从不完整输入字符串中搜索包含字符序列的单词或短语。 | |
将两个或多个操作符组合到一个查询中。 | |
检查字段是否与您指定的值匹配。 | |
测试指定索引字段名称的路径在文档中是否存在。 | |
用于允许按位置搜索的地理查询。 | |
返回与搜索条件匹配的文本片段,这对于需要突出显示搜索词的用户界面非常有用。 | |
在给定路径搜索由BSON数字、日期、布尔值、ObjectId、uuid 或字符串值组成的大量,并返回该字段的值等于指定大量中任意值的文档。 | |
返回与输入文档类似的文档。 | |
支持对数字、日期和GeoJSON point值进行查询和评分。 | |
使用索引配置中指定的分析器对包含有序术语序列的文档执行搜索。 | |
支持查询索引字段和值的组合。 | |
支持对数字、日期和字符串值进行查询和评分。 | |
将查询字段解释为正则表达式。 | |
使用在索引配置中指定的分析器执行全文搜索。 | |
启用在搜索字符串中使用可匹配任何字符的特殊字符的查询。 |
管道搜索阶段示例
注意
Atlas样本数据集
此示例使用Atlas示例数据集中的 sample_mflix.movies集合。要学习;了解如何设立免费套餐的Atlas 集群并加载示例数据集,请参阅Atlas文档中的Atlas入门教程。
在运行此示例之前,您必须在 movies集合上创建一个具有以下定义的Atlas Search索引:
{ "mappings": { "dynamic": true, "fields": { "title": { "analyzer": "lucene.keyword", "type": "string" }, "genres": { "normalizer": "lowercase", "type": "token" } } } }
要学习;了解有关创建Atlas Search索引的更多信息,请参阅 索引指南中的Atlas Search和 Vector Search 索引部分。
您可以将代码中的 <search index name> 占位符替换为Atlas Search索引的名称。
以下代码创建具有以下规范的 $search 阶段:
检查
genres大量是否包含"Comedy"在
fullplot字段中搜索字段"new york"匹配介于
1950和2000(含)之间的year值搜索以术语
"Love"开头的title值
use mongodb::{ bson::{doc, Document}, Client, Collection, }; use futures::stream::TryStreamExt; async fn main() -> mongodb::error::Result<()> { // Replace the uri string with your connection string let uri = "<connection string uri>"; let client = Client::with_uri_str(uri).await?; let my_coll: Collection<Document> = client .database("sample_mflix") .collection("movies"); // Creates a complex search using multiple operators let search_stage = doc! { "$search": { "index": "<search index name>", "compound": { "must": [ { "equals": { "path": "genres", "value": "Comedy" } }, { "phrase": { "path": "fullplot", "query": "new york" } }, { "range": { "path": "year", "gte": 1950, "lte": 2000 } }, { "wildcard": { "path": "title", "query": "Love*" } } ] } } }; let project_stage = doc! { "$project": { "title": 1, "year": 1, "genres": 1, "_id": 1 } }; let pipeline = vec![search_stage, project_stage]; let mut cursor = my_coll.aggregate(pipeline).await?; while let Some(doc) = cursor.try_next().await? { println!("{}", doc); } Ok(()) }
{ "_id": ObjectId("..."), "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979 } { "_id": ObjectId("..."), "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994 }
要学习;了解有关Atlas Search操作符的更多信息,请参阅Atlas Search操作符文档。
更多信息
要学习;了解有关Atlas Search 的更多信息,请参阅Atlas文档中的Atlas Search 。
API 文档
要学习;了解有关本指南中提到的方法的更多信息,请参阅以下API文档: