搜索文本
概述
在本指南中,您可以学习如何在MongoDB Kotlin驱动程序中运行文本搜索。
您可以使用文本搜索来检索包含指定字段中的术语或短语的文档。术语是一系列不包括空白字符的字符。短语是一系列术语,其中包含任意数量的空白字符。
以下部分向您展示如何执行以下类型的文本搜索
按术语搜索文本
按短语搜索文本
排除术语搜索文本
如果您想对文本搜索结果进行排序,请参阅文本搜索部分,该部分位于我们的排序结果指南中。
示例文档
以下部分展示了在fast_and_furious_movies
集合上进行的文本搜索示例。每个部分都使用名为 collection
的变量来引用 fast_and_furious_movies
集合的 MongoCollection
实例。
fast_and_furious_movies
集合包含描述“速度与激情”电影系列中几部电影之一的文档。每个文档都包含一个标题字段和一个标签字段。
{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] } { "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] } { "_id": 3, "title": "Furious 7", "tags": ["emotional"] } { "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }
这些数据使用以下Kotlin数据类建模
data class Movies( val id: Int, val title: String, val tags: List<String> )
文本索引
在运行文本搜索之前,您必须创建一个 文本索引。文本索引指定了运行文本搜索的字符串或字符串数组字段。
在以下示例中,您在 fast_and_furious_movies
集合中的 title
字段上运行文本搜索。要启用 title
字段的文本搜索,请使用以下代码片段使用 索引 构造函数创建文本索引
collection.createIndex(Indexes.text("title"))
有关更多信息,请参阅以下资源
文本搜索
使用 Filters.text()
方法指定文本搜索。
Filters.text()
方法使用 过滤器 构造函数定义一个查询过滤器,指定在文本搜索期间要搜索的内容。查询过滤器由一个 BSON 实例表示。将查询过滤器传递给 find()
方法以运行文本搜索。
当您执行 find()
方法时,MongoDB 会对该集合上带有文本索引的所有字段执行文本搜索。MongoDB 返回包含一个或多个搜索词的文档以及每个结果的相关性分数。有关相关性分数的更多信息,请参阅我们的排序结果指南中的 文本搜索 部分。
指定选项
您可以将 TextSearchOptions
作为 Filters.text()
方法的第二个参数,以指定文本搜索选项,例如大小写敏感。默认情况下,文本搜索不区分大小写,这意味着搜索匹配大小写。
要指定大小写敏感搜索,请使用以下代码片段
val options: TextSearchOptions = TextSearchOptions().caseSensitive(true) val filter = Filters.text("SomeText", options)
有关本节中提到的方法和类的更多信息,请参阅以下API文档
通过一个术语搜索文本
将术语作为字符串传递给 Filters.text()
方法,以指定文本搜索中的术语。
示例
以下示例在 fast_and_furious_movies
集合中的文档上执行包含术语 "fast" 的标题的文本搜索。
val filter = Filters.text("fast") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=1, title=2 Fast 2 Furious, tags=[undercover, drug dealer]) Movies(id=2, title=Fast 5, tags=[bank robbery, full team])
要在文本搜索中匹配多个术语,请在 Filters.text()
构建方法中用空格分隔每个术语。构建方法返回文本搜索查询作为 Bson
实例。当您将其传递给 find()
方法时,它返回匹配任何术语的文档。
示例
以下示例在 fast_and_furious_movies
集合中的文档上执行包含术语 "fate" 或 "7" 的标题的文本搜索。
val filter = Filters.text("fate 7") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=3, title=Furious 7, tags=[emotional]) Movies(id=4, title=The Fate of the Furious, tags=[betrayal])
通过短语搜索文本
将包含转义引号的短语传递给 Filters.text()
方法以指定文本搜索中的短语。转义引号是前面带有反斜杠的双引号字符。如果您不在短语周围添加转义引号,则 find()
方法将运行一个 术语搜索。
示例
以下示例在 fast_and_furious_movies
集合中运行文本搜索,搜索包含短语 "fate of the furious" 的标题
val filter = Filters.text("\"fate of the furious\"") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=4, title=The Fate of the Furious, tags=[betrayal])
排除术语的文本搜索
对于您想要从文本搜索中排除的每个术语,请在传递给 Filters.text()
构建器方法的字符串中将术语前缀为减号。
搜索返回的文档中,没有任何文档在您的文本索引字段中包含排除的词。
重要
如果您想从搜索中排除词,则至少必须有一个文本搜索词。
示例
以下示例在 fast_and_furious_movies
集合的文档上运行文本搜索,以查找包含“furious”但不含“fast”的标题
val filter = Filters.text("furious -fast") val findFlow = collection.find(filter) findFlow.collect { println(it) }
Movies(id=3, title=Furious 7, tags=[emotional]) Movies(id=4, title=The Fate of the Furious, tags=[betrayal])