MySQL 全文检索初窥

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&param1=0&param2=0

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

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

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

  4. 海量分词
    http://home.hylanda.com/show_5_19.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的路径里。

参考资料

  1. 百度百科-全文索引
  2. 全文索引原理及范例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值