MySQL 全文检索初窥

1. 全文索引是什么?

若是咱们要对数据库中的文本进行模糊查询,有什么办法?最容易想到的办法就是用sql的like语句,例如:php

SELECT * FROM table_name WHERE keyword LIKE '%keyword%'

但是然而可是,很快你会发现,这样作的效率不是通常的低下。若是有100万条以上的数据的话,速度每每是不能忍受的。并且LIKE ‘%keyword%’的话没法使用索引来加速。html

全文索引是一个解决上述问题的一个方案。原理是先定义一个词库,而后在文章中查找每一个词条(term)出现的频率和位置,把这样的频率和位置信息按照词库的顺序概括,这样就至关于对文件创建了一个以词库为目录的索引,这样查找某个词的时候就能很快的定位到该词出现的位置。mysql

这样作对于字母文字来讲问题不大,不管英语,法语,德语仍是意大利语,西班牙语等都是一个个单词之间由空格或其余标点符号来分割各个单词的。但是中文……web

2. 中文问题

中文的词和词之间通常是没有空格的,你怎么知道“下雨天留客天留我不留”是要分红“下雨天 留客天 留我不留”仍是“下雨 天留客 天留 我不留”?必须把中文的句子分红一个个词,才能进行全文检索。sql

3. 中文分词

确实中文分词是个难点,可是如今已经有不少的解决方案了。
1. 这个是一个中文分词的API
http://api.pullword.com/get.php?source=%E5%B7%B4%E6%96%AF%E5%BE%B7%E7%A7%BB%E6%B6%B2%E7%AE%A1&param1=0&param2=0数据库

  1. 新浪SAE的中文分词调用API
    http://sunweiwei.com/1451/api

  2. PHP开源的中文分词系统
    http://www.xunsearch.com/scws/demo.phpsvg

  3. Discuz! 中文分词
    http://www.qqoq.net/php-chinese-words-segmentation.htmlurl

  4. 海量分词
    http://home.hylanda.com/show_5_19.htmlspa

我会在另外一篇文档里介绍怎么利用现场的方案来实现中文分词的。

4. MySQL里的全文索引

对于InnoDB数据库引擎,须要MySQL版本在5.6以上

select * from t_pd_product where MATCH(f_desc_chn, f_desc_eng) AGAINST('硫酸铜') LIMIT 200

须要对f_desc_chn和f_desc_eng一块儿作全文索引

修改my.ini文件来设置
innodb_ft_min_token_size=1
innodb_ft_max_token_size=20

my.ini的位置在: 查看服务->mysql的路径里。

参考资料

  1. 百度百科-全文索引
  2. 全文索引原理及范例