若是咱们要对数据库中的文本进行模糊查询,有什么办法?最容易想到的办法就是用sql的like语句,例如:php
SELECT * FROM table_name WHERE keyword LIKE '%keyword%'
但是然而可是,很快你会发现,这样作的效率不是通常的低下。若是有100万条以上的数据的话,速度每每是不能忍受的。并且LIKE ‘%keyword%’的话没法使用索引来加速。html
全文索引是一个解决上述问题的一个方案。原理是先定义一个词库,而后在文章中查找每一个词条(term)出现的频率和位置,把这样的频率和位置信息按照词库的顺序概括,这样就至关于对文件创建了一个以词库为目录的索引,这样查找某个词的时候就能很快的定位到该词出现的位置。mysql
这样作对于字母文字来讲问题不大,不管英语,法语,德语仍是意大利语,西班牙语等都是一个个单词之间由空格或其余标点符号来分割各个单词的。但是中文……web
中文的词和词之间通常是没有空格的,你怎么知道“下雨天留客天留我不留”是要分红“下雨天 留客天 留我不留”仍是“下雨 天留客 天留 我不留”?必须把中文的句子分红一个个词,才能进行全文检索。sql
确实中文分词是个难点,可是如今已经有不少的解决方案了。
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/api
PHP开源的中文分词系统
http://www.xunsearch.com/scws/demo.phpsvg
Discuz! 中文分词
http://www.qqoq.net/php-chinese-words-segmentation.htmlurl
我会在另外一篇文档里介绍怎么利用现场的方案来实现中文分词的。
对于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的路径里。