本文目的
最近有个项目需要对数据进行搜索功能。采用的LAMP技术开发,所以自然想到了MySQL的全文检索功能。现在将自己搜集的一些资料小结,作为备忘。
MySQL引擎
据目前查到的资料,只有MyISAM引擎支持全文检索(full text index),查询效率高。但是有局限,不支持事务和外键。
Innodb支持事务和外键,但是不支持全文检索。所以,如果需要全文检索的数据,需要使用MyISAM引擎创建表。
MySQL中文全文检索
很遗憾,目前mysql不支持中文全文检索。目前有两种解决方案
- 方案1:使用mysql中文检索插件,个人认为可控性较差,虽然使用方便,但是如果后期插件出现问题,比较难解决。优点就是前期工作量相对较小。
- 方案2:中文分词+GB2312编码:通过分词将原文分隔开,然后转成GB2312的二进制文本形式(如一个字,4个字节A623,这样就可以搜索单个中文)。(转成GB2312编码是为了避免中英文混合搜索。mysql全文检索最小长度默认4(ft_min_word_len)个字,中文是4个汉字,英文是4个字母。对于中文,基本上都是2子词,所以设置ft_min_word_len为2,但英文中,2字的单词一般没有什么特殊意义,如‘is’,‘do’等,所以为了兼顾中英文语法习惯,将中文适当‘变长’,也就是转成GB2312的可见形式编码)
- 方案3:中文分词,ft_min_word_len设置为2,调用'repair table your_table quick',修复索引。相比方案2,此方案较节省空间。对于主要使用中文的系统而言,此方案更佳。
创建全文索引
举一个文章表(t_article)的例子,title和body作为列子,如下:
CREATE TABLE `t_article` (
`title` varchar(100) DEFAULT NULL,
`body` text,
FULLTEXT KEY `ft_title` (`title`),
FULLTEXT KEY `ft_body` (`body`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
P.S.: 如果有个表已经创建了全文索引,想要查看创建语法,可以使用“SHOW CREATE TABLE talbe_name;”这条命令显示表格的创建语句。
注意红色高亮部分就是全文检索的语法。删除也很简单,比如删除title的全文索引,“ALTER TABLE t_article DROP INDEX ft_title;”。
使用SQL检索
比如期望对body中的数据进行全文检索,命令如下
SELECT title, MATCH(body) AGAINST('php and other key word') AS score
FROM t_article
WHERE MATCH(body) AGAINST('php and other key word');
注意这里的score很重要,该值代表了关键字与文本的相关性,该值一般在0到1之间,但是也可能达到4或更多。
相关资料
- Using MySQL Full-text Searching
- How to drop this index in MySQL?
- 支持中文的MYSQL全文检索
- MySQL Fulltext Search 使用方式
- Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL?(PS: 个人理解全文检索技术产品中,mysql轻量级,sphinx中量级,Lucence重量级)
- 通过MySQL全文搜索实现中文的相关搜索(PS: 讲解了为什么需要将中文分词后转码,作为全文检索)
- 如何设置ft_min_word_len参数:http://www.tipandtrick.net/2008/how-to-change-mysql-fulltext-index-minimum-and-maximum-length-of-words/
转自:http://www.cnblogs.com/bourneli/archive/2012/08/09/2630753.html