目 录CONTENT

文章目录

MongoDB使用全文检索

陌念
2022-12-09 / 2 评论 / 1 点赞 / 17 阅读 / 0 字
温馨提示:
本文最后更新于2024-06-11,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一、前言

我们都知道 InnoDB 在模糊查询数据时使用%xx会导致索引失效,但有时需求就是如此,而MongoDB的全文检索则可以弥补这个缺陷。

二、全文检索

全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。MongoDB 从2.4版本开始支持全文检索,目前支持15种语言的全文索引。

2.1 启用全文检索

MongoDB 在2.6版本以后是默认开启全文检索的,如果你使用之前的版本,你需要使用以下代码来启用全文检索:

>db.adminCommand({setParameter:true,textSearchEnabled:true})

或者使用命令:

mongod --setParameter textSearchEnabled=true

2.2 创建全文索引

考虑以下 posts 集合的文档数据,包含了文章内容(post_text)及标签(tags):

{
   "post_text": "enjoy the mongodb articles on Runoob",
   "tags": [
      "mongodb",
      "runoob"
   ]
}

我们可以对 post_text 字段建立全文索引,这样我们可以搜索文章内的内容:

>db.posts.ensureIndex({post_text:"text"})

2.3 使用全文索引

现在我们已经对 post_text 建立了全文索引,我们可以搜索文章中的关键词 runoob:

>db.posts.find({$text:{$search:"runoob"}})

2.4 性能

全文索引和正则表达式都可以实现模糊搜索,但全文索引性能更高,因为用正则表达式的方式不会走索引,是全表扫描。

三、全文索引使用限制

全文索引非常强大,但是同样存在很多限制。

  • 每次查询,只能指定一个$text查询。

  • $text查询不能出现在$nor查询中。$nor查询是用来排除某些查询,排除某些条件。

  • 查询中如果包含了$text,hint不再起作用。hint可以强制指定索引,在查询的时候,一般不不要告诉MongoDB选取哪个索引,MongoDB会自动选区,但是某些情况下,我们可以测试下我们的索引性能,需要手工进行操作,如果查询中包含了$text,就不能使用hint

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
  3. QQ打赏

    qrcode qq

评论区