文字搜索

在本页面

概观

MongoDB 支持执行 string 内容的文本搜索的查询操作。要执行文本搜索,MongoDB 使用文字索引$text operator。

注意 查看不支持文本搜索。

这个 example 演示了如何 build 文本索引并使用它来查找咖啡店,只给出文本字段。

使用以下文档创建集合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" }
   ]
)

文字索引

MongoDB 提供文本索引以支持对 string 内容的文本搜索查询。 text索引可以包含 value 是 string 或 string 元素的 array 的任何字段。

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

对于 example,您可以在mongo shell 中运行以下内容,以允许在namedescription字段上进行文本搜索:

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

$text Operator

使用$text query operator 对带有文字索引的集合执行文本搜索。

$text将使用空格和大多数标点符号将搜索 string 标记为分隔符,并在搜索 string 中执行所有此类标记的逻辑OR

对于 example,您可以使用以下查询来查找包含“coffee”,“shop”和“java”列表中的任何术语的所有 stores:

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

精确短语

您还可以通过将它们包装在 double-quotes 中来搜索确切的短语。如果$search string 包含短语和单个术语,则文本搜索将仅匹配包含该短语的文档。

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

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

有关更多信息,请参阅短语

术语排除

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

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

排序

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

要在相关性得分 order 中对结果进行排序,您必须显式项目$meta textScore字段并对其进行排序:

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

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

语言支持

MongoDB 支持各种语言的文本搜索。有关支持的语言列表,请参阅文本搜索语言