Docs 菜单

Atlas Search

在本指南中,您可以学习;了解如何使用Java驾驶员对集合运行Atlas Search查询。 Atlas Search使您能够对MongoDB Atlas上托管的集合执行全文搜索。 Atlas Search索引指定搜索行为以及要索引的字段。

moviessample_mflix本指南中的示例使用Atlas示例数据集的 数据库中的 集合。要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅Atlas入门指南。要学习;了解有关聚合操作和构建者的更多信息,请参阅 聚合指南。

本部分介绍如何创建聚合管道以对集合运行Atlas Search查询。您可以使用 Aggregates.search() 构建器方法创建 $search管道阶段,其中指定搜索条件。然后,调用 aggregate() 方法并将管道作为参数传递。

注意

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

此聚合管道运算符仅适用于在运行 v4.2 或更高版本的MongoDB Atlas集群上托管且由Atlas Search索引覆盖的集合。 从Atlas Search文档了解有关此操作符所需设置和功能的更多信息。

在运行Atlas Search查询之前,您必须在集合上创建Atlas Search索引。要学习;了解如何以编程方式创建Atlas Search索引,请参阅索引指南中的Atlas Search和 Vector Search 索引部分。

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

  • 使用 Aggregates.search() 构建器方法构造 $search 阶段,指示驾驶员查询title字段包含单词 "Alabama" 的文档

  • 使用 Aggregates.project() 构建器方法构造 $project 阶段,指示驾驶员在查询结果中包含 title字段

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

collection.aggregate(
Arrays.asList(
Aggregates.search(SearchOperator.text(
SearchPath.fieldPath("title"), "Alabama")),
Aggregates.project(Projections.include("title"))
)
).forEach(doc -> System.out.println(doc.toJson()));
{"_id": {"$oid": "..."}, "title": "Alabama Moon"}
{"_id": {"$oid": "..."}, "title": "Crazy in Alabama"}
{"_id": {"$oid": "..."}, "title": "Sweet Home Alabama"}

提示

Java驱动程序Atlas Search示例

要查看使用Java驾驶员执行Atlas Search查询的更多示例,请参阅Atlas文档中的Atlas Search教程

使用 searchMeta() 方法创建 $searchMeta 管道阶段,该阶段仅返回Atlas全文搜索结果的元数据。

提示

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

此聚合管道操作符符仅适用于运行v4.4.11 及更高版本的MongoDB Atlas集群。有关版本可用性的详细列表,请参阅$searchMeta上的MongoDB Atlas文档。

以下示例显示了 Atlas 搜索聚合阶段的 near 元数据:

Aggregates.searchMeta(
SearchOperator.near(2010, 1, fieldPath("year")));

通过 searchMeta() API文档了解详情。

Java驾驶员为以下操作符提供了辅助方法:

Operator
说明

从不完整输入字符串中搜索包含字符序列的单词或短语。

将两个或多个操作符组合到一个查询中。

检查字段是否与您指定的值匹配。映射到 equals()equalsNull() 方法

测试指定索引字段名称的路径在文档中是否存在。

在给定路径搜索由BSON数字、日期、布尔值、objectId、uuid 或字符串值组成的大量,并返回该字段的值等于指定大量中任意值的文档。

返回与输入文档类似的文档。

支持对数字、日期和GeoJSON point值进行查询和评分。

使用索引配置中指定的分析器搜索包含有序术语序列的文档。

支持查询索引字段和值的组合。

支持对数字、日期和字符串值进行查询和评分。映射到 numberRange()dateRange() 方法

将查询字段解释为正则表达式。

使用在索引配置中指定的分析器执行全文搜索。

启用在搜索字符串中使用可匹配任何字符的特殊字符的查询。

注意

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 阶段:

  • 检查 genres大量是否包含 "Comedy"

  • fullplot 字段中搜索字段"new york"

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

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

List<Bson> pipeline = new ArrayList<>();
pipeline.add(Aggregates.search(
SearchOperator.compound()
.filter(
List.of(
SearchOperator.in(fieldPath("genres"), "Comedy"),
SearchOperator.phrase(fieldPath("fullplot"), "new york"),
SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000),
SearchOperator.wildcard(fieldPath("title"), "Love *")
))));
pipeline.add(Aggregates.project(
Projections.include("title", "year", "genres")
));
AggregateIterable<Document> results = collection.aggregate(pipeline);
results.forEach(doc -> System.out.println(doc.toJson()));
{"_id": ..., "genres": ["Comedy", "Romance"], "title": "Love at First Bite", "year": 1979}
{"_id": ..., "genres": ["Comedy", "Drama"], "title": "Love Affair", "year": 1994}

要学习;了解有关Atlas Search助手方法的更多信息,请参阅驱动程序核心API文档中的SearchOperator接口参考。

要学习;了解有关Atlas Search 的更多信息,请参阅Atlas文档中的Atlas Search

要学习;了解有关本指南中提到的方法的更多信息,请参阅以下API文档: