Overview
在本指南中,您可以学习;了解如何使用Java驾驶员对集合运行MongoDB搜索查询。MongoDB Search 使您能够对MongoDB Atlas上托管的集合执行全文搜索。MongoDB 搜索索引指定搜索行为以及要索引的字段。
样本数据
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搜索查询
本节展示如何创建聚合管道,以对集合运行 MongoDB Search 查询。 您可以使用 Aggregates.search() 构建器方法来创建 $search 管道阶段,该阶段指定搜索条件。然后,调用 aggregate() 方法,并将您的管道作为参数传递。
注意
Atlas和 Community Edition 版本要求
$search 聚合管道操作符仅适用于在运行 MongoDB v4.2 或更高版本的MongoDB Atlas集群上托管的集合,或者运行 MongoDB v8.2 或更高版本的MongoDB Community Edition集群上托管的集合。集合必须包含在MongoDB 搜索索引中。要了解有关此操作符所需设置和功能的更多信息,请参阅MongoDB 搜索文档。
在运行 MongoDB Search 查询之前,您必须在集合上创建 MongoDB Search 索引。要了解如何以编程方式创建 MongoDB Search 索引,请参阅索引指南中的 MongoDB Search 和 Vector Search 索引部分。
MongoDB搜索示例
此示例通过执行以下操作来运行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 教程。
MongoDB搜索元数据
使用 searchMeta() 方法创建 $searchMeta 管道阶段,该阶段仅返回 MongoDB 搜索结果的元数据。
注意
Atlas和 Community Edition 版本要求
此聚合管道操作符符仅适用于运行 MongoDB v4.4.11 及更高版本的MongoDB Atlas集群,或者运行 MongoDB v8.2 或更高版本的MongoDB Community Edition集群。有关版本可用性的详细列表,请参阅 $searchMeta 上的MongoDB Atlas文档。
以下示例显示了MongoDB 搜索聚合阶段的 near 元数据:
Aggregates.searchMeta( SearchOperator.near(2010, 1, fieldPath("year")));
要学习;了解有关此辅助方法的更多信息,请参阅 searchMeta() API文档。
创建管道搜索阶段
Java 驱动程序为以下操作符提供了辅助工具/辅助程序:
Operator | 说明 |
|---|---|
从不完整输入字符串中搜索包含字符序列的单词或短语。 | |
将两个或多个操作符组合到一个查询中。 | |
检查字段是否与您指定的值匹配。映射到 | |
测试指定索引字段名称的路径在文档中是否存在。 | |
在给定路径搜索由BSON数字、日期、布尔值、ObjectId、uuid 或字符串值组成的大量,并返回该字段的值等于指定大量中任意值的文档。 | |
返回与输入文档类似的文档。 | |
支持对数字、日期和GeoJSON point值进行查询和评分。 | |
使用索引配置中指定的分析器搜索包含有序术语序列的文档。 | |
支持查询索引字段和值的组合。 | |
支持对数字、日期和字符串值进行查询和评分。 映射到 | |
将查询字段解释为正则表达式。 | |
使用在索引配置中指定的分析器执行全文搜索。 | |
启用在搜索字符串中使用可匹配任何字符的特殊字符的查询。 |
管道搜索阶段示例
在运行此示例之前,您必须在具有以下定义的 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"匹配介于
1950和2000(含)之间的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 向量搜索操作符
在 SearchOperator 类上使用 vectorSearch() 或 vectorSearchExact() 静态方法在 $search 聚合管道阶段内执行向量搜索。这些方法允许您将向量相似搜索与其他 MongoDB Search 操作符结合使用,包括使用分析的文本预过滤器的操作符。
注意
MongoDB 向量搜索索引必需
要使用这些方法,您的集合必须配置 MongoDB 向量搜索 索引。要了解如何创建向量搜索索引,请参阅索引指南中的 MongoDB Search 和 Vector Search 索引部分。
使用 vectorSearch() 方法执行近似最近邻 (ANN) 搜索。使用 vectorSearchExact() 方法执行精确最近邻 (ENN) 搜索。这两种方法都接受以下参数:
Parameter | 类型 | 说明 |
|---|---|---|
|
| 要搜索的索引向量字段的路径。 |
|
| 查询向量。维度必须匹配索引字段。 |
|
| 要返回的最大结果数。 |
|
| 搜索期间要考虑的最近邻数量。仅对 |
这两种方法都返回 VectorSearchOperator 实例。您可以在返回的实例上链接以下方法:
方法 | 说明 |
|---|---|
| 在向量搜索之前应用 |
| 将分数修饰符应用于向量搜索结果。 |
vectorSearch() 示例
以下示例使用 vectorSearch() 方法对 movies 集合的 plot_embedding 字段执行近似最近邻 (ANN) 搜索。该示例将 text 操作符应用为 genres 字段上的词汇预过滤器。
List<Double> queryVector = List.of( -0.014, -0.055, 0.047, -0.041, 0.027); Bson searchStage = Aggregates.search( SearchOperator.vectorSearch( fieldPath("plot_embedding"), queryVector, 10, 20 ).filter(SearchOperator.text( fieldPath("genres"), "Drama"))); collection.aggregate(List.of(searchStage)) .forEach(result -> System.out.println(result));
vectorSearchExact() 示例
以下示例使用 vectorSearchExact() 方法对 movies 集合的 plot_embedding 字段执行精确最近邻 (ENN) 搜索:
List<Double> queryVector = List.of( -0.014, -0.055, 0.047, -0.041, 0.027); Bson searchStage = Aggregates.search( SearchOperator.vectorSearchExact( fieldPath("plot_embedding"), queryVector, 5)); collection.aggregate(List.of(searchStage)) .forEach(result -> System.out.println(result));
更多信息
要学习有关MongoDB Search 的更多信息,请参阅Atlas文档中的MongoDB Search。
API 文档
要学习;了解有关本指南中提到的方法的更多信息,请参阅以下API文档: