1. 全文索引是什么?
如果我们要对数据库中的文本进行模糊查询,有什么办法?最容易想到的办法就是用sql的like语句,例如:
SELECT * FROM table_name WHERE keyword LIKE '%keyword%'
可是然而但是,很快你会发现,这样做的效率不是一般的低下。如果有100万条以上的数据的话,速度往往是不能忍受的。而且LIKE ‘%keyword%’的话无法使用索引来加速。
全文索引是一个解决上述问题的一个方案。原理是先定义一个词库,然后在文章中查找每个词条(term)出现的频率和位置,把这样的频率和位置信息按照词库的顺序归纳,这样就相当于对文件建立了一个以词库为目录的索引,这样查找某个词的时候就能很快的定位到该词出现的位置。
这样做对于字母文字来说问题不大,无论英语,法语,德语还是意大利语,西班牙语等都是一个个单词之间由空格或其他标点符号来分割各个单词的。可是中文……
2. 中文问题
中文的词和词之间一般是没有空格的,你怎么知道“下雨天留客天留我不留”是要分成“下雨天 留客天 留我不留”还是“下雨 天留客 天留 我不留”?必须把中文的句子分成一个个词,才能进行全文检索。
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¶m1=0¶m2=0
新浪SAE的中文分词调用API
http://sunweiwei.com/1451/PHP开源的中文分词系统
http://www.xunsearch.com/scws/demo.phpDiscuz! 中文分词
http://www.qqoq.net/php-chinese-words-segmentation.html
我会在另一篇文档里介绍怎么利用现场的方案来实现中文分词的。
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的路径里。