文本搜索
概述
在本指南中,您可以学习如何在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 会对该集合中文本索引索引的所有字段运行文本搜索。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"] }