mysql全文索引____内置分词变量

上一节,我们发现搜索‘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*进行搜索。

本文出自 “原下” 博客,请务必保留此出处http://imysqldba.blog.51cto.com/1222376/1618936

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。