文档菜单
文档首页
/ / /
Kotlin 协程

搜索文本

本页

  • 概述
  • 示例文档
  • 文本索引
  • 文本搜索
  • 指定选项
  • 按术语搜索文本
  • 按短语搜索文本
  • 排除术语搜索文本

在本指南中,您可以学习如何在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(
@BsonId 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])

下一步

MongoDB Kotlin 驱动程序