MongoDB 全文检索学习笔记

什么是全文检索?

全文检索(Full-text Search)是一种关键词搜索方式,可以在一个或多个文本字段中查找包含关键词的文档。与传统的基于关键词匹配的搜索方式相比,全文检索可以更加准确地找到相关的文档。

MongoDB 中的全文检索

MongoDB 提供了全文检索功能,可以在集合中的一个或多个文本字段上执行文本搜索。全文检索使用文本索引来实现,文本索引存储了文档中的所有单词及其在文档中的位置信息,以便进行有效的搜索。

创建文本索引

要在集合中启用全文检索,需要创建一个文本索引。可以使用 db.collection.createIndex() 方法来创建文本索引。

例如,以下命令将在 users 集合的 name 字段上创建文本索引:

Copy Code
db.users.createIndex({ name: "text" })

可以同时在多个字段上创建文本索引,例如:

Copy Code
db.users.createIndex({ name: "text", address: "text" })

执行全文检索

创建了文本索引后,就可以在集合中执行全文检索了。可以使用 $text 查询操作符来执行全文检索查询。

以下命令将在 users 集合中查找包含关键词 "John" 的文档:

Copy Code
db.users.find({ $text: { $search: "John" }})

举例说明

假设有一个 articles 集合,其中包含了多篇文章的标题和正文内容。以下是一个示例文档:

Copy Code
{ "_id": ObjectId("60b7a19ea71c2d4138375e69"), "title": "MongoDB 全文检索", "content": "MongoDB 是一款文档型数据库...", "published_at": ISODate("2023-05-01T08:00:00Z") }

现在我们想要查找包含关键词 "MongoDB" 的文章,可以使用以下命令进行查询:

Copy Code
db.articles.find({ $text: { $search: "MongoDB" }})

这会返回所有标题或正文中包含关键词 "MongoDB" 的文章。如果只想查找标题中包含关键词的文章,可以指定要搜索的字段:

Copy Code
db.articles.find({ $text: { $search: "MongoDB", $diacriticSensitive: true }, }, { score: { $meta: "textScore" } })

其中 $diacriticSensitive 参数用于区分大小写和重音符号,score 字段用于返回匹配度得分。