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);

發現結果如下:

wKiom1T-YmnxN1jbAABD_ROcZGk090.jpg

看到,已經能夠搜索到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);

發現結果如下:

wKiom1T-Y4yyCgg_AABPmVZ2XMM870.jpg

已經能搜索出'b,a'和'c,a'所在的行。


注意:全文索引並不是能搜索出字符串裏面的任意字符,只能搜索出有ft_boolean_syntax變量的片段開頭的字符串。如ba,無法通過a進行搜索,但是b,a卻可以通過a進行搜索;b,abc可以通過布爾模式下的a*進行搜索,也可以通過布爾模式下的b*進行搜索,但是無法通過布爾模式下的c*進行搜索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章