對於剛使用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');
卻有結果如下:
我們看一下全文索引相關的參數設置。
SHOW GLOBAL VARIABLES LIKE '%ft_%';
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');
以上查詢,能查詢到對應的數據。
但是疑問來了,爲什麼我查詢關鍵字'a',卻無法搜索出'aa','aaa','aaaa'關鍵字對應的行呢?
有興趣的童鞋可以自行思考一下,或者關注我後續的mysql全文索引相關文章。