上一节,我们发现搜索‘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*进行搜索。
时间: 2024-10-11 06:50:36