Mysql全文索引的使用

摘要:
前言在MySQL5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词.在学习之前,请确认自己的MySQL版本大于5.7.6.我的版本为5.7.20.同时文中的所有操作都基于InnoDB存储引擎.什么是全文索引?对于倒排索引,这里不再展开,有兴趣的朋友可以自行了解一下.目前,MySQL仅可以在char,varchar,text属性的列上建立全文索引.如何创建全文索引?

前言

在MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词.

在学习之前,请确认自己的MySQL版本大于5.7.6.我的版本为5.7.20.同时文中的所有操作都基于InnoDB存储引擎.

什么是全文索引?

如果有搞过lucene,solr,es之类的,理解起来会方便许多.

日常我们使用MySQL查询时,大部分的查询都是定值或者范围查询.类似于下面这样:

select *
from table 
where id = 1

select *
from table 
where id > 20

但是当在MySQL中存储了文本,比如某个字段的值为坚决贯彻党的十八大精神,我们想用贯彻和十八大作为关键字时都可以搜索到这条记录.那么只能使用like关键字.而对于like我们知道,当不是用左边前缀搜索的时候,无法命中索引,因此对于这条语句select * from articles where content like '%贯彻%',MySQL只能进行全表扫描,逐一进行匹配.这样的效率极其低下.

而全文索引呢,通过建立倒排索引,可以极大的提升检索效率.

倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。

对于倒排索引,这里不再展开,有兴趣的朋友可以自行了解一下.

目前,MySQL仅可以在char,varchar,text属性的列上建立全文索引.

如何创建全文索引?

创建全文索引的时机与创建其他类型的索引没什么不同,可以在建表时候创建,也可以通过alter语句创建.这里贴一下建表的同时建立全文索引.

CREATE TABLEarticles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR (200),
    body TEXT,
    FULLTEXT (title, body) WITHPARSER ngram
) ENGINE = INNODB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';

上述语句建立了一个article表,且对其中的title和body字段建立了全文索引.

使用alter语句建立索引示例如下:

ALTER TABLE articles ADD FULLTEXT INDEX title_body_index (title,body) WITH PARSER ngram;

如何使用全文索引进行搜索?

MySQL的全文索引查询有多种模式,我们一般经常使用两种.

1. 自然语言搜索

就是普通的包含关键词的搜索.

2. BOOLEAN MODE

这个模式和lucene中的BooleanQuery很像,可以通过一些操作符,来指定搜索词在结果中的包含情况.比如+嘻哈表示必须包含嘻哈,-嘻哈表示必须不包含,默认为误操作符,代表可以出现可以不出现,但是出现时在查询结果集中的排名较高一些.也就是该结果和搜索词的相关性高一些.

具体包含的所有操作符可以通过MySQL查询来查看:

Mysql全文索引的使用第1张

使用自然语言搜索如下:

Mysql全文索引的使用第2张

可以看到,搜索结果命中了一条,且在不指定搜索模式的情况下,默认模式为自然语言搜索.

使用boolean搜索如下:

Mysql全文索引的使用第3张

当搜索必须命中精神时,命中了一条数据,当在加上不能包含贯彻的时候,无命中结果.

总结

InnoDB支持全文索引,当然是个好消息,在一些小的全文搜索场景下,可以只使用关系型数据库就搞定了.

他的效率比起like当然是高了不少,但是我没有测试过在千万级数据量下的搜索效率,因为搞出千万级的测试数据是在是太麻烦了.不过我想在大数据量的情景下表现应该不是很好.

对于全文索引的需求,如果只是很小的数据量,且对搜索结果的精确度和可定制化程度要求不高的话,可以使用MySQL的全文索引,如果是专门的做搜索,对搜索中的分词以及结果都有较高的要求,建议还是使用lucene,es相关的哪一套全文搜索工具包来做.

转载于:https://www.cnblogs.com/yehuisir/p/11340558.html

免责声明:文章转载自《Mysql全文索引的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Tab Separated Values (TSV): a format for tabular data exchange反序列化漏洞下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

重建索引到指定表空间

数据存储时,最好是将数据与索引分开存储在不同的表空间中,因为建立索引是要占用硬盘存储空间的,索引表空间和数据表空间建立是一样的 下面语句用于移动索引到指定表空间: alter index ha_wxzj.index_name rebuild tablespace ha_wxzj_index_data; 也可以利用以下语句获得某个schema下移动索引表空间...

MYSQL连接字符串参数详细解析(大全参考)

阅读目录 Connector/Net Connection String Options Reference 回到目录 Connector/Net Connection String Options Reference Database=dbname;Data Source=192.168.1.1;Port=3306;User Id=root;Pa...

MySQL5.6 新特性之GTID

1.mysql5.6在复制方面的新特性: (1).支持多线程复制:事实上是针对每个database开启相应的独立线程,即每个库有一个单独的(sql thread).针对这样的改进,如果我们想实现多线程复制,无疑要对现存的数据库结构进行重新设计,分库分表.对于压力都集中在个别database的,多线程并发复制特性就没有意义. (2).支持启用GTID,在配置...

mysql数据库编码问题

一:插入数据乱码 ①:数据库的字符集不对,需要修改成utf-8;如果解决不了走第二步 ②: var cmd = new MySqlCommand(“set names utf8”);如果解决不了走第三步 ③:把“Charset=utf8”加载数据库连接字符串后边即可。在解决不了没辙了,换数据库吧!  二:获取有乱码问题  Incorrect strin...

使用SyncNavigator轻松实现数据库异地同步、断点续传、异构同步

最近一直在研究数据库同步的问题,在网上查了很多资料,也请教了很多人,找到了一种通过快照复制的方法。研究了一番后发现之前就是用的这个方法,效果不是很好,果断放弃。经过了一番寻觅和他人指点,最后从一位热心网友那里得知一款很好用的软件—— SyncNavigator。 好东西就要拿出来跟大家分享,所以今天向大家介绍一下这款软件,及其一些使用方法。下面先看看它有...

Centos 7 安装mysql后出现 ERROR 2002 (HY000)解决方案

Centos 7 安装mysql后出现 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 切换成root, systemctl start mariadb.service systemctl enab...