概述

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

注意 视图不支持文本搜索。

文字索引

MongoDB提供文本索引以支持对字符串内容的文本搜索查询。text索引可以包含任何值为字符串或字符串元素数组的字段。
要执行文本搜索查询,text的集合上必须有一个 索引。一个集合只能有一个 文本搜索索引,但是该索引可以涵盖多个字段
例如,您可以在mongo shell中运行以下命令,以允许在名称和描述字段中进行文本搜索:

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

$text运算符

使用$text查询运算符对具有文本索引的集合执行文本搜索。
$text将使用空格和大多数标点作为分隔符对搜索字符串进行标记,并在搜索字符串中对所有这些标记执行逻辑或操作。
例如,您可以使用以下查询来查找包含“coffee”、“shop”和“java”列表中任何术语的所有商店:

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

准确的短语

还可以通过将短语包装在双引号中来搜索精确的短语。如果$search字符串包含一个短语和单个术语,文本搜索将只匹配包含该短语的文档。
例如,以下将查找包含“coffee shop”的所有文档:

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

要匹配短语而不是单个术语,请将短语用转义双引号(\”)括起来,如下所示:

  1. "\"ssl certificate\""

如果**$search**字符串包含短语和单个术语,则文本搜索将仅匹配包含短语的文档。
例如,传递了一个$search字符串:

  1. "\"ssl certificate\" authority key"

$text运营商将搜索短语。”ssl certificate”

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

否定的短语

用连字符减号(-)前缀的单词会否定一个单词:

  • 否定词会从结果集中排除包含否定词的文档。
  • 传递仅包含否定单词的搜索字符串时,文本搜索将不匹配任何文档。
  • 带连字符的词(例如pre-market)不是否定词。如果在带连字符的单词中使用,$text运算符会将连字符减号(-)视为定界符。要market在这种情况下取反该单词,请在pre和之间添加一个空格-market,即 。pre -market

$text运营商将所有否定于与逻辑的查询AND操作。

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

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

文本排序操作

默认情况下,MongoDB将以未排序的顺序返回结果。但是,文本搜索查询将为每个文档计算相关性分数,以指定文档与查询的匹配程度。
要按相关性得分的顺序对结果进行排序,必须显式投影该字段并对其进行排序:$meta textScore
有关$text$meta 运算符的更多信息,包括限制和行为,请参阅:

  • $textReferencePage
  • $ text查询示例
  • $meta 投影算子
    1. db.stores.find(
    2. { $text: { $search: "java coffee shop" } },
    3. { score: { $meta: "textScore" } }
    4. ).sort( { score: { $meta: "textScore" } } )
    ```powershell // 1 { “_id”: 3, “name”: “Coffee Shop”, “description”: “Just coffee”, “score”: 2.25 }

// 2 { “_id”: 1, “name”: “Java Hut”, “description”: “Coffee and cakes”, “score”: 1.5 }

// 3 { “_id”: 5, “name”: “Java Shopping”, “description”: “Indonesian goods”, “score”: 0.75 }

`` score`便是排序值,文本匹配度越高,值越大

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

聚合管道中的文本索引