服务器之家

服务器之家 > 正文

Mongodb实战之全文搜索功能

时间:2020-05-14 14:52     来源/作者:jingsam

前言

众所周知在传统的关系型数据库中,我们通常将数据结构化,通过一系列表关联、聚合来查询我们所需的结果。而在非结构化的数据中,缺少这种预定义的结构,因而如何快速查询定位到我们所需要的结果,不是一件容易的事。

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数组的字段建立文本索引。

我们可以通过以下命令,建立一个文本索引:

?
1
db.collection.createIndex({ subject: "text", content: "text" })

在mongoose中我们可以通过以下代码,创建文本索引:

?
1
schema.index({ subject: "text", content: "text" })

需要注意的是:由于每个collection只支持一个文本索引,所以当你需要在schema中添加或删除文本索引字段时,往往不起作用。这时候你需要到数据库中,手动删除已经建立的文本索引。

文本搜索示例

文本搜索的语法为:

?
1
2
3
4
5
6
7
8
9
{
 $text:
  {
   $search: <string>,
   $language: <string>,
   $caseSensitive: <boolean>,
   $diacriticSensitive: <boolean>
  }
}

在mongoose中,我们可以通过以下语句进行文本搜索:

?
1
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é是同一语义,只是重音不一样。

我们还可以对搜索的结果按匹配度进行排序:

?
1
2
3
4
db.posts.find(
  { $text: { $search: "hello world" } },
  { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

注意事项

Mongodb建立文本索引时,会对提取所有文本的关键字建立索引,因而会造成一定的性能问题。所以对于结构化的字段,建议用普通的关系查询,如果需要对大段的文本进行搜索,才考虑用全文搜索。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持

原文链接:https://jingsam.github.io/2016/06/04/mongodb-text-search.html

标签:

相关文章

热门资讯

歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
返回顶部