MongoDB支持对文档中的字符串内容执行文本查询的查询操作。 要执行文本查询, MongoDB使用文本索引和 $text
查询运算符。
要学习;了解有关其他文本搜索选项(例如全文搜索和向量搜索)的详情,请参阅MongoDB Server手册中的 文本搜索 概述。
驾驶员提供了 Filters.text()
辅助方法来促进文本查询筛选器的创建。
先决条件
您必须设置以下组件才能运行本指南中的代码示例:
test.restaurants
集合,其中填充了文档资产Github中restaurants.json
文件中的文档。以下 import 语句:
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Indexes; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import com.mongodb.client.model.TextSearchOptions; import com.mongodb.client.model.Projections; import org.bson.Document;
重要
本指南使用自定义Subscriber
实现,如自定义订阅者实现示例指南中所述。
连接到 MongoDB 部署
首先,连接到 MongoDB 部署并声明和定义MongoDatabase
和MongoCollection
实例。
以下代码连接到在端口27017
上的localhost
上运行的独立 MongoDB 部署。 然后,定义database
变量以引用test
数据库,并collection
变量以引用restaurants
集合:
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
要了解有关连接到 MongoDB 部署的更多信息,请参阅连接到 MongoDB教程。
创建文本索引
要创建文本索引,请使用Indexes.text()
静态助手为文本索引创建规范,并将规范传递给MongoCollection.createIndex()
方法以创建索引。
以下示例在restaurants
集合的name
字段上创建文本索引:
MongoCollection<Document> collection = database.getCollection("restaurants"); collection.createIndex(Indexes.text("name")).subscribe(new PrintToStringSubscriber<String>());
执行文本查询
要执行文本查询,请使用 Filters.text()
辅助方法指定文本查询过滤。
示例,以下代码对 name
字段执行文本查询以匹配字符串 "bakery"
或 "coffee"
:
collection .countDocuments(Filters.text("bakery coffee")) .subscribe(new PrintSubscriber<Long>("Text query matches: %s"));
Text query matches: [2]
文本分数
对于每个匹配的文档,文本查询会分配一个分数,该分数表示文档与指定文本查询过滤的相关性。要返回分数并按分数排序,请在投影文档和排序表达式中使用 $meta
操作符:
collection.find(Filters.text("bakery cafe")) .projection(Projections.metaTextScore("score")) .sort(Sorts.metaTextScore("score")) .subscribe(new PrintDocumentSubscriber());
指定文本查询选项
Filters.text()
助手可接受各种文本查询选项。驾驶员提供了 TextSearchOptions
类来指定这些选项。
示例,以下文本查询在对单词 "cafe"
执行文本查询时指定了文本查询语言选项:
collection.countDocuments( Filters.text("cafe", new TextSearchOptions().language("english")) ).subscribe(new PrintSubscriber<Long>("Text query matches (English): %s"));
Text query matches (English): [1]
要学习;了解有关文本查询的更多信息,请参阅MongoDB Server手册中的以下部分: