MySQL 內建全文索引(Fulltext Index)支援自然語言搜尋與布爾模式搜尋,但預設最小詞長 4 字符且不支援中文分詞。本文記錄配置流程、查詢模式差異及中文解決方案路徑。
CREATE TABLE `student` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`studentname` VARCHAR(16) NOT NULL,
`address` VARCHAR(256) DEFAULT '北京',
`gender` TINYINT(4) NOT NULL,
`mymoney` DECIMAL(18,2) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `studentname` (`studentname`)
) ENGINE=MYISAM CHARSET=utf8;
關鍵點:
FULLTEXT KEY 可定義在單列或多列組合上;INSERT INTO student (studentname,...) VALUES ('happy love happy',...);預設 ft_min_word_len=4 導致 1-3 字符詞不被索引。修改配置檔:
# my.cnf / my.ini
[mysqld]
ft_min_word_len=1
重啟 MySQL 後驗證:
SHOW VARIABLES LIKE 'ft_min_word_len';
-- Value 應為 1
注意:修改此參數需重建全文索引生效:REPAIR TABLE student QUICK; 或 ALTER TABLE student DROP INDEX studentname, ADD FULLTEXT(studentname);
SELECT * FROM student WHERE MATCH(studentname) AGAINST('love');
按相關度排序,有 50% 閾值限制:若詞項出現在超過 50% 文檔中則被忽略(視為停用詞)。單表測試常因文檔太少導致無結果。
SELECT * FROM student WHERE MATCH(studentname) AGAINST('love' IN BOOLEAN MODE);
支援運算符:
+ 必須包含、- 必須不包含;* 萬用字元(僅尾部);"phrase" 精確短語;~ 降低相關度。MySQL 內建分詞器按空格/標點切分,**無法識別中文詞邊界**(如「全文索引」會被視為單一 Token)。解決路徑:
ngram(MySQL 5.7.6+ 內建)或 MeCab 解析器支援中日韓分詞;
ALTER TABLE student DROP INDEX studentname;
ALTER TABLE student ADD FULLTEXT INDEX studentname (studentname) WITH PARSER ngram;
-- ngram 預設 bigram (2-gram),可配置 ngram_token_size
此為原生無依賴的中文全文檢索最優路徑。