標籤: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‘);
卻有結果如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5A/68/wKiom1T9AeDgHDyJAAAXCki0VZE494.jpg" title="QQ圖片20150309101336.png" alt="wKiom1T9AeDgHDyJAAAXCki0VZE494.jpg" />
我們看一下全文索引相關的參數設定。
SHOW GLOBAL VARIABLES LIKE ‘%ft_%‘;
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5A/64/wKioL1T9Ab_xjt5FAACi7QKAEtg283.jpg" title="BaiduShurufa_2015-3-9_10-8-14.png" alt="wKioL1T9Ab_xjt5FAACi7QKAEtg283.jpg" />
5.6之前myisam的全文索引,需要調節的參數相對來說比較少,只有以上五個。
ft_boolean_syntax:全文索引分詞關鍵字,不能更改,為內建變數ft_max_word_len:最大分詞長度,一般情況下不需要更改ft_min_word_len:最小分詞長度,一般修改為1ft_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‘);
以上查詢,能查詢到對應的資料。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5A/64/wKioL1T9Bo_TuEPuAAAYuQ3Frgk261.jpg" title="BaiduShurufa_2015-3-9_10-28-32.png" alt="wKioL1T9Bo_TuEPuAAAYuQ3Frgk261.jpg" />
但是疑問來了,為什麼我查詢關鍵字‘a‘,卻無法搜尋出‘aa‘,‘aaa‘,‘aaaa‘關鍵字對應的行呢?
有興趣的童鞋可以自行思考一下,或者關注我後續的mysql全文索引相關文章。
本文出自 “原下” 部落格,請務必保留此出處http://imysqldba.blog.51cto.com/1222376/1618487
mysql全文索引____ft_min_word_len