Docs 菜单
Docs 主页
/ /

MongoDB Search

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

The examples in this guide use the movies collection in the sample_mflix database from the Atlas sample datasets. To learn how to create a free MongoDB deployment and load the sample datasets, see the MongoDB Get Started guide. To learn more about aggregation operations and builders, see the Aggregation guide.

本节展示如何创建聚合管道,以对集合运行 MongoDB 搜索查询。 您可以使用 Aggregates.search() 构建器方法来创建 $search 管道阶段,该阶段指定搜索条件。然后,调用 aggregate() 方法,并将您的管道作为参数传递。

注意

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

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

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

此示例通过执行以下操作来运行MongoDB 搜索查询:

  • 使用 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 驱动程序 MongoDB Search 示例

要查看使用 Java 驱动程序执行 MongoDB Search 查询的更多示例,请参阅 Atlas 文档中的 MongoDB Search 教程

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

提示

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

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

以下示例显示了MongoDB 搜索聚合阶段的 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 集合上创建 MongoDB 搜索索引:

{
"mappings": {
"dynamic": true,
"fields": {
"title": {
"analyzer": "lucene.keyword",
"type": "string"
},
"genres": {
"normalizer": "lowercase",
"type": "token"
}
}
}
}

要了解有关创建 MongoDB Search 索引的更多信息,请参阅索引指南的 MongoDB 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}

要学习有关MongoDB 搜索辅助程序方法的更多信息,请参阅驱动程序 Core API 文档中的SearchOperator接口参考。

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

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

后退

运行命令

在此页面上