关于全文索引:第30期索引设计全文索引中文处理
本篇是全文索引终篇,来细聊下 MySQL 全文索引对中文如何解决。在理解 MySQL 全文索引如何解决中文之前,先来看看什么是分词。 MySQL 全文索引默认是基于单字节流解决的,也就是依照单词与进行词(默认空格或者标点符号)来划分各个关键词,并且把关键词的文档ID和地位保留到辅助表用于前期检索。这种对英文,数字类的单字节字符解决很好, 比方“I am a boy!”, 每个单词很明确的用空格宰割,前期查问只须要依照以空格为分隔符的单词检索就行,这些我后面三篇文章曾经具体讲过。然而这种宰割办法对多字节字符比方中文不是很敌对,对中文来说每个字就是独自的字,无规律的字能够组成词,然而各个词之间不须要依照空格来宰割。举个例子:“为中国人骄傲” ,这句话蕴含了三个词“为”,“中国人”,“骄傲”。如果依照默认的全文索引解决,搜寻其中任何子句,后果必定是出不来。这也间接导致大家说 MySQL 的全文检索后果不精确,不靠谱,其实并非如此,次要是MySQL 全文索引对分词以及进行符界定有差别。例如上面,表 ft_ch ,有三条记录,怎么查都没有没有后果。 mysql> create table ft_ch(id int unsigned auto_increment primary key, s1 varchar(200),fulltext ft_s1(s1));Query OK, 0 rows affected (0.39 sec)mysql> select * from ft_ch where match(s1) against ('我是');Empty set (0.00 sec)mysql> select * from ft_ch where match(s1) against ('中国');Empty set (0.00 sec)mysql> select * from ft_ch where match(s1) against ('我是中');Empty set (0.01 sec)但这张表其实有记录: ...