搜索文本
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
您必须先创建文本索引,再执行文本搜索。文本索引指定要执行文本搜索的字符串或字符串数组字段。
在以下示例中,您对 fast_and_furious_movies
集合中的 title
字段运行文本搜索。要能够在 title
上进行文本搜索,请使用索引构建器创建包含以下代码段的文本索引:
collection.createIndex(Indexes.text("title"));
有关更多信息,请参阅以下资源:
文本搜索(Text Search)
使用 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()
方法,以在文本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"] }