上一節,我們發現搜索'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*進行搜索。