文本搜索
MongoDB支持在文档中的字符串内容上执行文本搜索的查询操作。要执行文本搜索,MongoDB使用文本索引和$text
查询运算符。有关文本搜索的更多信息,请参阅服务器手册中的文本搜索。
驱动程序提供了Filters.text()
辅助方法来简化文本搜索查询过滤器的创建。
先决条件
您必须设置以下组件才能运行本指南中的代码示例
一个
test.restaurants
集合,其中包含来自restaurants.json
文件的文档,该文件位于文档资产GitHub以下导入语句
import org.mongodb.scala._ import org.mongodb.scala.model._
注意
本指南使用Quick Start Primer中涵盖的Observable
隐式。快速入门入门.
连接到MongoDB部署
首先,连接到MongoDB部署,然后声明并定义 MongoDatabase
和 MongoCollection
实例。
以下代码连接到在 localhost
上运行的独立MongoDB部署的端口 27017
。然后,定义 database
变量以引用 test
数据库,并定义 collection
变量以引用 restaurants
集合
val mongoClient: MongoClient = MongoClient() val database: MongoDatabase = mongoClient.getDatabase("test") val collection: MongoCollection[Document] = database.getCollection("restaurants")
要了解更多关于连接到MongoDB部署的信息,请参阅 连接到MongoDB 教程。
创建文本索引
要创建文本索引,使用 Indexes.text()
静态辅助函数来创建文本索引的规范,并将规范传递给 MongoCollection.createIndex()
方法以创建索引。
以下示例在集合中文档的 name
字段上创建文本索引
collection.createIndex(Indexes.text("name")).printResults()
执行文本搜索
要执行文本搜索,请使用 Filters.text()
辅助方法来指定文本搜索查询过滤器。
例如,以下代码在 name
字段上执行文本搜索,以匹配字符串 "bakery"
或 "coffee"
collection.countDocuments(Filters.text("bakery coffee")).printResults("Text search matches: ")
Text search matches: [2]
文本得分
对于每个匹配的文档,文本搜索会分配一个得分,表示文档与指定的文本搜索查询过滤器的相关性。要按得分返回和排序,请在投影文档中使用$meta
运算符和排序表达式。
collection.find(Filters.text("bakery cafe")) .projection(Projections.metaTextScore("score")) .sort(Sorts.metaTextScore("score")) .printResults()
指定文本搜索选项
Filters.text()
辅助函数可以接受各种文本搜索选项。驱动程序提供了TextSearchOptions
类来指定这些选项。
例如,以下文本搜索在搜索单词"cafe"
时指定了文本搜索语言选项。
collection.countDocuments(Filters.text("cafe", TextSearchOptions().language("english"))) .printResults("Text search matches (english): ")
Text search matches (english): [1]
有关文本搜索的更多信息,请参阅MongoDB服务器手册的以下部分