MongoDB支持对文档中的字符串内容执行文本查询的查询操作。要执行文本查询, MongoDB使用文本索引和$text 查询运算符。要学习;了解有关全文搜索选项的更多信息,请参阅服务器手册中的文本搜索。
驱动程序提供了 Filters.text() 辅助方法来促进文本查询筛选条件的创建。
先决条件
您必须设置以下组件才能运行本指南中的代码示例:
test.restaurants集合,其中填充了文档资产restaurants.jsonGithub 中 文件中的文档。以下 import 语句:
import org.mongodb.scala._ import org.mongodb.scala.model._
注意
本指南使用快速入门入门中所述的Observable隐式。
连接到 MongoDB 部署
首先,连接到 MongoDB 部署,然后声明并定义MongoDatabase和MongoCollection实例。
以下代码连接到在端口27017上的localhost上运行的独立 MongoDB 部署。 然后,定义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 query matches: ")
Text query 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 query matches (english): ")
Text query matches (english): [1]
要学习;了解有关文本查询的更多信息,请参阅MongoDB Server手册中的以下部分: