这里有新鲜出炉的 MongoDB 教程,程序狗速度看过来!
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 web 应用提供可扩展的高性能数据存储解决方案。
全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。下面这篇文章主要给大家介绍了 Mongodb 全文搜索功能的相关资料,需要的朋友可以参考下。
前言
众所周知在传统的关系型数据库中,我们通常将数据结构化,通过一系列表关联、聚合来查询我们所需的结果。而在非结构化的数据中,缺少这种预定义的结构,因而如何快速查询定位到我们所需要的结果,不是一件容易的事。
Mongodb 作为一种 NoSQL 数据库,非常适合存储和管理非结构化数据,例如互联网上的各种文本数据。假如我们用 Mongodb 存储了很多博客文章,那么如何快速找到所有关于 "nodejs" 这个主题的文章呢?Mongodb 内建的全文搜索可以帮助我们完成这个功能。下面话不多说了,来一起看看详细的介绍:
在本篇博文中,将要介绍的是我使用 Mongdb text search 的一些经验。
Mongodb text search 是什么?
Mongodb text search 是 Mongodb 对数据库进行搜索的功能模块,类似于数据库内建的搜索引擎。有些人可能会疑问,查数据库为什么还需要搜索引擎?直接用条件查询不就得了。例如在前面的文章主题搜索中,我们不可能事先提取出每篇文章的主题,然后用专门的字段存储,因此没办法进行条件查询。并且同一个主题词,有多种不同的表达方式,例如 "node"、"nodejs" 可视为同一个主题。
Mongodb text search 可以自动地对大段的文本数据进行分词处理、模糊匹配、同义词匹配,解决文本搜索的问题。
建立文本索引
要使 Mongodb 能够进行全文搜索,首先要对搜索的字段建立文本索引。建立文本索引的关键字是 text,我们既可以建立单个字段的文本索引,也可以建立包含多个字段的复合文本索引。需要注意的是,每个 collection 只能建立一个文本索引,且只能对 String 或 String 数组的字段建立文本索引。
我们可以通过以下命令,建立一个文本索引:
- db.collection.createIndex({ subject: "text", content: "text" })
在 mongoose 中我们可以通过以下代码,创建文本索引:
- schema.index({ subject: "text", content: "text" })
需要注意的是:由于每个 collection 只支持一个文本索引,所以当你需要在 schema 中添加或删除文本索引字段时,往往不起作用。这时候你需要到数据库中,手动删除已经建立的文本索引。
文本搜索示例
文本搜索的语法为:
- {
- $text:
- {
- $search: <string>,
- $language: <string>,
- $caseSensitive: <boolean>,
- $diacriticSensitive: <boolean>
- }
- }
在 mongoose 中,我们可以通过以下语句进行文本搜索:
- var query = model.find({ $text: { $search: "hello world" } })
$search 后面的关键词可以有多个,关键词之间的分隔符可以是多种字符,例如空格、下划线、逗号、加号等,但不能是 - 和 \",因为这两个符号会有其他用途。搜索的多个关键字是 or 的关系,除非你的关键字包含 -。例如 hello world 会包含所有匹配 hello 或 world 的文本,而 hello -world 只会匹配包含 hello 且不包含 world 的文本。
$language 指示搜索的语言类型,在最新的 Mongodb 3.2 enterprise 版本中,已经增加了对中文文本的搜索。
$caseSensitive 设置是否区分大小写。
$diacriticSensitive 设置是否区别发音符号,CAFÉ 于 Café 是同一语义,只是重音不一样。
我们还可以对搜索的结果按匹配度进行排序:
- db.posts.find(
- { $text: { $search: "hello world" } },
- { score: { $meta: "textScore" } }
- ).sort( { score: { $meta: "textScore" } } )
注意事项
Mongodb 建立文本索引时,会对提取所有文本的关键字建立索引,因而会造成一定的性能问题。所以对于结构化的字段,建议用普通的关系查询,如果需要对大段的文本进行搜索,才考虑用全文搜索。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持
来源: http://www.phperz.com/article/17/0813/344447.html