Docs 菜单
Docs 主页
/ /

运行 Atlas Search 查询

在本指南中,您可以学习;了解如何使用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和 Vector Search 索引部分。您可以将本指南代码示例中的<search index name> 占位符替换为Atlas Search索引的名称。

创建Atlas Search索引后,在管道阶段大量中添加 $search 阶段以指定搜索条件。然后,调用 aggregate() 方法并将管道大量作为参数传递。

提示

要学习;了解有关聚合操作的更多信息,请参阅 聚合指南。

此示例通过执行以下操作来运行Atlas Search查询:

  • 创建一个 $search 阶段,指示驾驶员查询title字段包含单词 "Alabama" 的文档

  • 创建一个 $project 阶段,指示驱动程序在查询结果中包含 title 字段

  • 将管道阶段传递到 aggregate() 方法并打印结果

use mongodb::{
bson::{doc, Document},
Client, Collection,
};
use futures::stream::TryStreamExt;
#[tokio::main]
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"
}

使用$searchMeta 管道阶段创建 $searchMeta聚合阶段,该阶段仅返回Atlas Search结果中的元数据。

提示

仅适用于 Atlas for MongoDB v4.4.11 及更高版本

此聚合管道操作符仅适用于运行 v4.4.11 及更高版本的 MongoDB Atlas 集群。

以下示例展示了如何检索Atlas Search聚合阶段的元数据:

use mongodb::{
bson::{doc, Document, DateTime},
Client, Collection,
};
use futures::stream::TryStreamExt;
#[tokio::main]
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 的类型系统构造复杂的搜索,从而提高编译时安全性。

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"

  • 匹配介于 19502000(含)之间的 year

  • 搜索以术语"Love" 开头的 title

use mongodb::{
bson::{doc, Document},
Client, Collection,
};
use futures::stream::TryStreamExt;
#[tokio::main]
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文档:

后退

索引

在此页面上