Overview
在本指南中,您可以学习;了解如何在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"] }
Text Index
必须在运行文本查询之前创建文本索引。文本索引指定要运行文本搜索的字符串或字符串大量字段。
在以下示例中,您将对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"] }