上一节,我们发现搜索'a',但是发现'aa','aaa','aaaa'搜索不出来。为什么呢?
这就涉及到mysql的一个内置变量ft_boolean_syntax。ft_boolean_syntax
Variable_name Value
ft_boolean_syntax + ->
该变量的意思,表示需要被全文索引的字段通过以上这些变量进行分词切分。
譬如有一段字符串"a,b,c,ab",如果用mysql的内部分词算法,将这段字符串切分的话,会被切分为四段,分别是:a
b
c
ab
然后根据这四段进行索引存储。然后我们匹配的时候,是直接拿需要搜索的和这四段字符串进行等值匹配。
所以,我们搜索a关键字,只会搜索到a,却无法搜索到ab。但是,我们要想搜索到ab怎么办呢?也是可以用全文索引的通配符的,在布尔模式下搜索a*就能匹配到。
同理,我们再模拟上次的数据CREATE TABLE mysql_fulltext
(id BIGINT UNSIGNED AUTO_INCREMENT,
text_info VARCHAR(1000) NOT NULL,
PRIMARY KEY(id),
FULLTEXT(text_info)
)ENGINE=MYISAM DEFAULT CHARSET utf8 COMMENT 'mysql全文索引测试表';
INSERT INTO `mysql_fulltext`(text_info) VALUES ('a'),('b'),('c'),('aa'),('bb'),('cc'),('aaa'),('bbb'),('ccc'),('aaaa'),('bbbb'),('cccc');
同样,我们先执行下面的sql语句SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('a');
发现只能搜索到a所在的行。
但是,我们通过布尔模式下,搜索a*来尝试改变sql语句SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('a*' IN BOOLEAN MODE);
发现结果如下:
看到,已经能够搜索到a,aa,aaa,aaaa了。
但是,我们我们再次写入如下数据INSERT INTO `mysql_fulltext`(text_info) VALUES ('ba'),('ca');
再次执行SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('a*' IN BOOLEAN MODE);
发现无法搜索出ba和ca所在的行。
为什么呢?因为ba和ca两个字符串都没有ft_boolean_syntax + ->
包含涉及到的变量,所以,无法被mysql的全文索引引擎切分为独立的分词进行存储。
我们再次写入如下数据INSERT INTO `mysql_fulltext`(text_info) VALUES ('b,a'),('c,a');
再次执行SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('a*' IN BOOLEAN MODE);
发现结果如下:
已经能搜索出'b,a'和'c,a'所在的行。
注意:全文索引并不是能搜索出字符串里面的任意字符,只能搜索出有ft_boolean_syntax变量的片段开头的字符串。如ba,无法通过a进行搜索,但是b,a却可以通过a进行搜索;b,abc可以通过布尔模式下的a*进行搜索,也可以通过布尔模式下的b*进行搜索,但是无法通过布尔模式下的c*进行搜索。