Text Search

在本页面

Overview

MongoDB 支持执行字符串内容的文本搜索的查询操作。要执行文本搜索,MongoDB 使用text index$text运算符。

Note

Views不支持文本搜索。

Example

此示例演示了如何在仅指定文本字段的情况下构建文本索引并使用它来查找咖啡店。

创建包含以下文档的集合stores

db.stores.insert(
   [
     { _id: 1, name: "Java Hut", description: "Coffee and cakes" },
     { _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },
     { _id: 3, name: "Coffee Shop", description: "Just coffee" },
     { _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" },
     { _id: 5, name: "Java Shopping", description: "Indonesian goods" }
   ]
)

Text Index

MongoDB 提供text indexes以支持对字符串内容的文本搜索查询。 text索引可以包含任何值为字符串或字符串元素数组的字段。

要执行文本搜索查询,您的集合上必须具有text索引。一个集合只能有一个文本搜索索引,但是该索引可以覆盖多个字段。

例如,您可以在mongo shell 中运行以下命令,以允许在namedescription字段上进行文本搜索:

db.stores.createIndex( { name: "text", description: "text" } )

$text Operator

使用$text查询运算符对带有text index的集合执行文本搜索。

$text将使用空格和大多数标点符号作为分隔符来对搜索字符串进行标记化,并对搜索字符串中的所有此类标记执行逻辑OR

例如,您可以使用以下查询从列表“ coffee”,“ shop”和“ java”中查找包含任何术语的所有 Store:

db.stores.find( { $text: { $search: "java coffee shop" } } )

Exact Phrase

您还可以通过将它们括在双引号中来搜索确切的短语。如果$search字符串包含短语和单个术语,则文本搜索将仅匹配包含该短语的文档。

例如,以下将查找包含“咖啡店”的所有文档:

db.stores.find( { $text: { $search: "\"coffee shop\"" } } )

有关更多信息,请参见Phrases

Term Exclusion

要排除单词,您可以在前面加上“ -”字符。例如,要查找所有包含“ java”或“ shop”但不包含“ coffee”的 Store,请使用以下命令:

db.stores.find( { $text: { $search: "java shop -coffee" } } )

Sorting

默认情况下,MongoDB 将以未排序的 Sequences 返回结果。但是,文本搜索查询将为每个文档计算相关性分数,以指定文档与查询的匹配程度。

要按相关性得分的 Sequences 对结果进行排序,您必须显式投影$meta textScore字段并对其进行排序:

db.stores.find(
   { $text: { $search: "java coffee shop" } },
   { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

聚合管道中也提供文本搜索。

Language Support

MongoDB 支持多种语言的文本搜索。有关支持的语言列表,请参见Literals 搜寻语言