📜  在 MongoDB 中搜索文本

📅  最后修改于: 2022-05-13 01:56:58.158000             🧑  作者: Mango

在 MongoDB 中搜索文本

MongoDB 提供了一种很好的技术,即文本搜索。使用这种技术,我们可以从字符串字段中找到一段文本或一个指定的单词。或者换句话说,MongoDB 允许您执行查询操作以从字符串查找指定的文本。在 MongoDB 中,我们可以使用 text index 和 $text 运算符执行文本搜索。

文字索引: MongoDB 证明了用于从字符串内容中查找指定文本的文本索引。文本索引应该是字符串或字符串元素数组。当您执行文本搜索查询时,请始终记住您的集合必须包含一个文本索引,并且一个集合只能包含一个文本索引,但该单个文本索引涵盖多个字段。我们可以使用 createIndex() 方法创建文本索引。

句法:

$text 运算符:您还可以使用 $text运算符搜索文本索引。此运算符用于对具有文本索引的集合执行文本搜索操作。此运算符使用空格标记每个搜索字符串,并将大多数标点符号视为分隔符,除了 – 和 \”。在对搜索字符串进行标记后,它对标记执行逻辑 OR 操作。如果要对结果文档进行排序,请使用 $meta 查询运算符。



句法:

如何搜索文本?

使用以下步骤,我们可以在 MongoDB 中搜索文本:

第 1 步:首先,我们创建一个集合并向集合中添加一些文档:

在以下示例中,我们正在使用:

第二步:创建索引:

现在我们在 createIndex() 的帮助下在 name 和 pet 字段上创建一个字符串索引 方法。所以我们可以在 name 和 line 字段上搜索文本:

db.content.createIndex({name:"text",line:"text"})



第 3 步:搜索文本:

现在我们准备搜索文本。例如,我们要搜索所有包含文本 love 的文档。

db.content.find({$text:{$search:"love"}})  

注意:$text是一个查询运算符,它在一个带有文本索引的集合上执行文本搜索。

另一个示例,我们将在其中搜索所有包含 dog 文本的文档:

db.content.find({$text:{$search:"dog"}})

如何搜索词组?

除了搜索单个单词,您还可以通过将短语括在双引号 (“”) 中来搜索短语。通常,词组搜索在指定的关键字之间执行 OR 运算。例如,短语是“I like Mango”,然后阶段搜索查找包含关键字 I、like 或 Mango 的所有文档。如果您想执行精确的短语搜索,则将阶段括在转义的双引号 (\”) 之间。

句法:

对于短语搜索:

对于精确短语搜索:

例子:

在以下示例中,我们正在使用:

  • 找到这句话:
db.content.find({$text:{$search:"I love dogs"}})

在这里,我们搜索短语“我爱狗”。因此,在结果中,我们得到所有包含关键字 I、love 或 dog 的文档。



  • 找到确切的短语:
db.content.find({$text:{$search:"\"I love dogs\""}})

在这里,我们通过将相位包裹在转义双引号 (\”) 之间来搜索确切的短语,即“\”我爱狗\””。因此,在结果中,我们只得到那些包含指定确切短语的文档。

如何从搜索中排除一个术语?

词条排除是指当您执行搜索操作时,不希望显示包含指定词条的文档时,您可以通过在搜索关键字前加上减号(-)来排除该词条。使用减号(-)可以排除所有包含排除项的文档。例如,您希望显示包含关键字“Car”但不包含“Cycle”关键字的所有文档,因此您可以使用以下查询:

dn.collectionName.find({$text:{$search:"Car -Cycle"}})

例如:

在以下示例中,我们正在使用:

db.content.find({$text:{$search:"dog -cow"}})

在这里,我们只显示那些包含 dog 而不是 cow 的文档。



使用聚合管道搜索文本

我们可以在$match阶段的$text查询运算符的帮助下使用聚合管道搜索文本。但是使用$text运算符有一些限制:

  • 管道中的第一个阶段必须是包含$text运算符的$match阶段。
  • 只有一次在舞台上才会出现文本运算符。
  • 文本运算符的表达式不能出现在$or$not 的表达式中。
  • 默认情况下,文本搜索不会按照匹配分数的顺序返回匹配的文档。如果要按降序排序,请在 $sort 阶段使用 $meta 聚合表达式。

注意:文本分数是由 $text运算符分配给在索引字段中保存搜索词的每个文档的分数。该分数反映了文档对给定文本搜索查询的重要性。

例子:

在以下示例中,我们正在使用:

  • 统计宠物值为猫的文档个数:
db.people.aggregate([{$match:{$text:{$search:"Cat"}}},
             {$group:{_id:null,total:{$sum:1}}}])

  • 统计宠物值为狗的文档个数:
db.people.aggregate([{$match:{$text:{$search:"Dog"}}},
             {$group:{_id:null,total:{$sum:1}}}])

  • 使用文本分数返回排序结果:
db.people.aggregate([{$match:{$text:{$search:"Dog"}}},
                     {$sort:{score:{$meta:"textScore"}}},
                     {$project:{_id:0,name:1}}])

在这里,我们使用 textScore 以排序的形式返回结果(包含指定文本的所有文档,即“Dog”)。