全文索引是關聯式資料庫內建的倒排索引機制,適合**中小規模文本搜尋** (千萬級以內)。本文涵蓋建立條件、my.cnf 配置、自然語言/布爾模式、50% 閾值陷阱、中文分詞整合 (SCWS) 完整實戰流程。
-- 建表時指定
CREATE TABLE temp (
id INT AUTO_INCREMENT PRIMARY KEY,
`char` CHAR(50) NOT NULL,
`varchar` VARCHAR(50) NOT NULL,
`text` TEXT NOT NULL,
FULLTEXT KEY ft_char (`char`),
FULLTEXT KEY ft_varchar (`varchar`),
FULLTEXT KEY ft_text (`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 既有表新增
ALTER TABLE temp ADD FULLTEXT INDEX ft_char (`char`);
圖形工具 (phpMyAdmin/Workbench/DBeaver) 中對應「全文索引」/「Fulltext」勾選項。
[mysqld]
# 最小索引詞長 (預設 4,中文建議 1 或 2)
ft_min_word_len = 1
# 停用詞表 (預設內建英文,中文可指定空檔案禁用)
ft_stopword_file = ''
# 布爾模式運算子 (可自訂)
ft_boolean_syntax = '+ -><()~*:""&|'
修改後必須重啟 MySQL 並重建索引 (`REPAIR TABLE tbl QUICK` 或 `ALTER TABLE tbl DROP INDEX ft_xxx, ADD FULLTEXT INDEX ft_xxx (...)`)。
SELECT * FROM temp WHERE MATCH(`char`) AGAINST ('a bc 知道');
-- 強制包含 'a',忽略 50% 閾值
SELECT * FROM temp WHERE MATCH(`char`) AGAINST ('a' IN BOOLEAN MODE);
-- 運算子範例
'+apple +juice' -- 必須同時包含
'+apple -pie' -- 包含 apple 但不含 pie
'apple*' -- 前綴匹配 (apple, apples, applet)
'"apple juice"' -- 精確短語
'~apple' -- 降低相關性 (軟排除)
'+apple +(>juice
-- 初始 1 筆資料:'a bc 我 知道 1 23'
-- 搜尋 'a' → 0 結果 (100% > 50%)
-- 插入 3 筆雜湊資料稀釋
INSERT INTO temp (`char`) VALUES ('7'), ('7'), ('x');
-- 再搜尋 'a' → 1 結果 (25% < 50%)
生產環境破解方案:
MySQL 內建無中文分詞,**必須應用層分詞後寫入**,查詢時同樣分詞。
[scws]
extension = php_scws.dll
scws.default.charset = utf8
scws.default.fpath = "D:\\scws"
$str = "測試中文分詞";
$so = scws_new();
$so->send_text($str);
$so->set_charset('utf8');
$so->set_dict('D:/scws/dict.xdb');
$so->set_rule('D:/scws/rules.utf8.ini');
$result = $so->get_result();
$so->close();
/* $result 結構:
Array(
[0] => Array( word => '測試', idf => 3.2, attr => 'n', off => 0, len => 2 ),
[1] => Array( word => '中文', idf => 4.1, attr => 'n', off => 2, len => 2 ),
[2] => Array( word => '分詞', idf => 5.0, attr => 'v', off => 4, len => 2 )
) */
// 寫入資料庫:用空格或逗號連接詞彙
$keywords = implode(' ', array_column($result, 'word'));
// INSERT ... SET keywords = '$keywords'
寫入路徑: 接收原文 → SCWS 分詞 → 詞彙以空格連接 → 寫入 FULLTEXT 欄位
查詢路徑: 接收關鍵字 → SCWS 分詞 → 組裝布爾模式查詢 (如 `+詞1 +詞2`) → MATCH ... AGAINST (IN BOOLEAN MODE)