文本搜索
MongoDB 支持查询操作,这些操作在文档中的字符串内容上执行文本搜索。要执行文本搜索,MongoDB 使用文本索引和$text
查询运算符。有关文本搜索的更多信息,请参阅服务器手册中的文本搜索。
驱动程序提供了 Filters.text()
辅助方法,以简化文本搜索查询过滤器的创建。
先决条件
您必须设置以下组件才能运行本指南中的代码示例
一个填充了来自文档资源 GitHub 中的中的
restaurants.json
文件文档的test.restaurants
集合以下导入语句
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
实例。
以下代码连接到在本地主机localhost
的端口27017
上运行的独立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 search matches: %s"));
Text search 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 search matches (english): %s"));
Text search matches (english): [1]
要了解更多关于文本搜索的信息,请参阅 MongoDB 服务器手册中的以下部分: