Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
Java (Sync) 驱动程序
/ /

查询文本

在本指南中,您可以学习;了解如何在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"] }

必须在运行文本查询之前创建文本索引。文本索引指定要运行文本搜索的字符串或字符串大量字段。

在以下示例中,您将对title fast_and_furious_movies集合中的 字段运行文本查询。要启用对title 字段的文本搜索,请使用索引构建器使用以下代码段创建文本索引:

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

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

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

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

使用 Filters.text() 方法指定文本查询。

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

执行find() 方法时, MongoDB会对使用集合上的文本索引进行索引的所有字段运行文本查询。 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()方法,以指定文本查询中的短语。转义引号是双引号字符,前面有一个反斜杠字符。如果不在短语两边添加转义引号,find() 方法将运行术语搜索。

以下示例对 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"] }

后退

按地理空间搜索

在此页面上