全文索引是 MySQL 中一種特殊的 FULLTEXT 類型索引,專門用於對文本數據進行高效的自然語言搜索。它主要應用於 MyISAM 表(MySQL 5.6+ 也支持 InnoDB),可在 CREATE TABLE 時定義,或通過 ALTER TABLE / CREATE INDEX 後續添加至 CHAR、VARCHAR 或 TEXT 列上。
性能提示: 對於大數據量表,建議先導入數據,再創建全文索引,速度遠快於先建索引再導入數據。
全文搜索通過 MATCH() 函數實現,語法如下:
SELECT * FROM table_name
WHERE MATCH (col1, col2, ...) AGAINST ('search_string');
IN BOOLEAN MODE 修飾符,支持 +(必須包含)、-(必須排除)、>/<(調整權重)、()(分組)、~(降低權重)、*(通配符)、""(精確短語)等操作符。CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title, body)
) ENGINE=MyISAM;
INSERT INTO articles VALUES
(NULL, 'MySQL Tutorial', 'DBMS stands for DataBase ...'),
(NULL, 'How To Use MySQL Efficiently', 'After you went through a ...'),
(NULL, 'Optimising MySQL', 'In this tutorial we will show ...'),
(NULL, '1001 MySQL Tricks', '1. Never run MySQLd as root. 2. ...'),
(NULL, 'MySQL vs. YourSQL', 'In the following database comparison ...'),
(NULL, 'MySQL Security', 'When configured properly, MySQL ...');
SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('database');
-- 返回包含 "database" 的記錄,按相關性排序
SELECT id, MATCH (title, body) AGAINST ('Tutorial') AS score
FROM articles;
SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
-- 必須包含 MySQL,且不包含 YourSQL,不受 50% 閾值限制
' 和 _ 組成。基於:詞在記錄中的出現次數、記錄中唯一詞數、整個集合中詞的總數、包含該詞的文檔數。
MATCH() 的列必須來自同一張表,且屬於同一個 FULLTEXT 索引(布爾模式除外)。MATCH() 列列表必須精確匹配索引定義的列順序(布爾模式除外)。AGAINST() 參數必須是常量字符串。| 參數 | 說明 |
|---|---|
ft_min_word_len | 被索引詞的最小長度(默認 4) |
ft_stopword_file | 自定義停用詞文件路徑 |
ft_boolean_syntax | 布爾模式操作符集合 |
注意: 修改底層參數(如禁用 50% 閾值)需重新編譯 MySQL,通常建議改用布爾模式而非調整核心邏輯。
FULLTEXT 可調參數MySQL 全文搜索為中小型應用提供了開箱即用的文本檢索能力。理解其自然語言與布爾模式的差異、50% 閾值機制、詞切分規則,能幫助開發者避開常見坑點。大規模或高並發場景下,建議引入 Elasticsearch 等專業搜索引擎。