Docs 菜单
Docs 主页
/ / /
Java (Sync) 驱动程序
/ / /

搜索文本

在此页面上

  • Overview
  • 示例文档
  • Text Index
  • 文本搜索(Text Search)
  • 指定选项
  • 按词语搜索文本
  • 按短语搜索文本
  • 搜索不包括词语的文本

在本指南中,您可以了解如何在 MongoDB Java 驱动程序中运行文本搜索

您可以使用文本搜索来检索在指定字段中包含词语短语的文档。词语是不包含空格字符的一系列字符。短语是包含任意数量的空白字符的一系列词语。

以下各部分介绍如何执行以下类型的文本搜索:

  • 按词语搜索文本

  • 按短语搜索文本

  • 搜索不包括词语的文本

如果您想对文本搜索结果进行排序,请参阅排序结果指南中的文本搜索部分。

以下各节提供对 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"] }

您必须先创建文本索引,再执行文本搜索。文本索引指定要执行文本搜索的字符串或字符串数组字段。

在以下示例中,您对 fast_and_furious_movies 集合中的 title 字段运行文本搜索。要能够在 title 上进行文本搜索,请使用索引构建器创建包含以下代码段的文本索引:

collection.createIndex(Indexes.text("title"));

有关更多信息,请参阅以下资源:

  • 索引指南的文本索引部分

  • 文本索引服务器手册条目

使用 Filters.text() 方法指定文本搜索。

Filters.text() 方法使用筛选器生成器定义查询筛选器,指定在文本搜索期间要搜索的内容。查询筛选器由 BSON 实例表示。将查询筛选器传递给 find() 方法以运行文本搜索。

执行find()方法时,MongoDB 会对使用collection上的文本索引建立索引的所有字段进行搜索。MongoDB 返回包含一个或多个搜索术语以及每个结果的相关性分数的文档。有关相关性分数的更多信息,请参阅排序结果指南中的文本搜索部分。

您可以将 TextSearchOptions 作为 Filters.text() 方法的第二个参数,以指定文本搜索选项,例如区分大小写。默认情况下,文本搜索不区分大小写,这意味着搜索会匹配小写和大写值。

要指定区分大小写的搜索,请使用以下代码段:

TextSearchOptions options = new TextSearchOptions().caseSensitive(true);
Bson filter = Filters.text("SomeText", options);

有关本节中提到的方法和类的详情,请参阅以下 API 文档:

将搜索词作为字符串传递给 Filters.text() 方法,指定文本搜索中的搜索词。

以下示例对 fast_and_furious_movies 集合中的文档运行文本搜索,查找包含词语“fast”的标题:

Bson filter = Filters.text("fast");
collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述代码的输出:

{ "_id": 1, "title": "2 Fast 2 Furious ", "tags": ["undercover", "drug dealer"] }
{ "_id": 2, "title": "Fast 5", "tags": ["bank robbery", "full team"] }

要匹配文本搜索中的多个词语,请在 Filters.text() 构建器方法中用空格分隔每个词语。构建器方法将文本搜索查询作为 Bson 实例返回。当您将其传递给 find() 方法时,它会返回与任何词语匹配的文档。

以下示例对 fast_and_furious_movies 集合中的文档运行文本搜索,查找包含词语“fate”或“7”的标题:

Bson filter = Filters.text("fate 7");
collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述代码的输出:

{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] }
{ "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }

将带有转义引号的短语传递给 Filters.text() 方法,以在文本Atlas Search中指定该短语。 转义引号是双引号字符,前面有一个反斜杠字符。 如果不在短语两边添加转义引号,find() 方法将运行术语Atlas Search 。

以下示例对 fast_and_furious_movies 集合中的文档运行文本搜索,查找包含短语“fate of the furious”的标题:

Bson filter = Filters.text("\"fate of the furious\"");
collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述代码的输出:

{ "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }

对于要从文本搜索中排除的每个词语,请在传递给 Filters.text() 构建器方法的字符串中为该词语添加负号前缀。

搜索返回的文档均不包含文本索引字段中排除的词语。

重要

如果要从搜索中排除词语,则必须至少有一个文本搜索词。

以下示例对 fast_and_furious_movies 集合中的文档运行文本搜索,查找包含词 "furious" 但不包含词 "fast" 的标题:

Bson filter = Filters.text("furious -fast");
collection.find(filter).forEach(doc -> System.out.println(doc.toJson()));

以下显示了上述代码的输出:

{ "_id": 3, "title": "Furious 7", "tags": ["emotional"] }
{ "_id": 4, "title": "The Fate of the Furious", "tags": ["betrayal"] }

后退

按地理空间搜索