一、前言
我们都知道 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
。
评论区