mysql全文索引____ft_min_word_len

對於剛使用mysql全文索引搜索的童鞋,第一個疑惑可能就是,爲什麼我搜索xx結果不顯示呢?明明我數據裏面有。這個問題有很多種原因,其中最常見的就是ft_min_word_len(最小搜索長度)導致的。

準備測試數據如下

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

使用如下語句進行搜索

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('a');
SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('aa');
SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('aaa');

按照我們的慣性思維,應該會顯示四條數據纔對;但結果卻是一條數據都沒有。


但是我們執行

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('aaaa');

卻有結果如下:

wKiom1T9AeDgHDyJAAAXCki0VZE494.jpg



我們看一下全文索引相關的參數設置。

SHOW GLOBAL VARIABLES LIKE '%ft_%';

wKioL1T9Ab_xjt5FAACi7QKAEtg283.jpg

5.6之前myisam的全文索引,需要調節的參數相對來說比較少,只有以上五個。

ft_boolean_syntax:全文索引分詞關鍵字,不能更改,爲內置變量
ft_max_word_len:最大分詞長度,一般情況下不需要更改
ft_min_word_len:最小分詞長度,一般修改爲1
ft_query_expansion_limit:不明覺厲的一個參數,基本上不需要設置
ft_stopword_file:全文停止詞

我們發現ft_min_word_len爲4,默認是該值。也就是說,mysql fulltext只會對4個字或者4個字以上的關鍵字進行建立索引操作。而剛剛搜索的'a','aa','aaa'關鍵字長度都小於4。


全文索引相關的參數都無法進行動態修改,我們需要在/etc/my.cnf添加參數ft_min_word_len=1,並且重啓mysql服務器,重啓完畢之後,對應表執行repair操作。理論上,涉及到ft_相關參數修改的,都需要重啓服務器,並且修復所有含有fulltext索引的表。

使用如下sql語句尋找含有fulltext索引的表

SELECT DISTINCT CONCAT('repair table ',table_schema,'.',table_name,' quick;') FROM information_schema.`STATISTICS` WHERE index_type='fulltext'

我們修復mysql_fulltext後,執行查詢語句

REPAIR TABLE mysql_fulltext QUICK;
SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST('a');

以上查詢,能查詢到對應的數據。

wKioL1T9Bo_TuEPuAAAYuQ3Frgk261.jpg

但是疑問來了,爲什麼我查詢關鍵字'a',卻無法搜索出'aa','aaa','aaaa'關鍵字對應的行呢?

有興趣的童鞋可以自行思考一下,或者關注我後續的mysql全文索引相關文章。

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