Overview
在本指南中,您可以学习;了解如何使用Java驾驶员对集合运行MongoDB搜索查询。MongoDB Search 使您能够对MongoDB Atlas上托管的集合执行全文搜索。MongoDB 搜索索引指定搜索行为以及要索引的字段。
样本数据
本指南中的示例使用来自 Atlas 示例数据集的 sample_mflix 数据库中的 movies 集合。要了解如何创建免费的 MongoDB 部署并加载示例数据集,请参阅 MongoDB入门指南。 要了解更多关于聚合操作和构建器的信息,请参阅聚合指南。
运行MongoDB搜索查询
本节展示如何创建聚合管道,以对集合运行 MongoDB Search 查询。 您可以使用 Aggregates.search() 构建器方法来创建 $search 管道阶段,该阶段指定搜索条件。然后,调用 aggregate() 方法,并将您的管道作为参数传递。
注意
Atlas和 Community Edition 版本要求
$search聚合管道操作符仅适用于在运行MongoDB v. 或更高版本的MongoDB4 2Atlas集群上托管的集合,或者运行MongoDB v. 或更高版本的MongoDB Community8 2Edition集群上托管的集合。集合必须包含在MongoDB Search索引中。要学习;了解有关此操作符符所需设置和功能的更多信息,请参阅MongoDB Search 文档。
在运行 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()));
提示
Java 驱动程序 MongoDB Search 示例
要查看使用 Java 驱动程序执行 MongoDB Search 查询的更多示例,请参阅 Atlas 文档中的 MongoDB Search 教程。
MongoDB搜索元数据
使用 searchMeta() 方法创建 $searchMeta 管道阶段,该阶段仅返回 MongoDB Search 结果的元数据。
注意
Atlas和 Community Edition 版本要求
此聚合管道操作符符仅适用于运行MongoDB v.. 及更高版本的MongoDB Atlas集群,或者运行MongoDB4 411v. 或更高版本的MongoDB Community Edition集群。有关版本可用性的详细列表,请参阅8 2$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()));
要学习有关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文档: