首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 中文全文索引插件 mysqlcft 安裝與使用完整指南

     編輯:MySQL 資料庫相關知識

為什麼需要 mysqlcft?

MySQL 內建全文索引**不支援中文分詞**,將中文視為單一詞元,導致 `MATCH...AGAINST` 無法正確匹配中文關鍵字。`mysqlcft` 是基於 C++ 開發的解析器插件,支援中文分詞,讓 MySQL 原生全文索引具備中文搜尋能力。

前置需求

  • MySQL **必須為動態編譯安裝** (支援 `plugin_dir` 動態載入 `.so`/`dll`)
  • MySQL 版本 5.1+ (支援插件架構)
  • Linux: `.so` 檔案 / Windows: `.dll` 檔案 (編譯對應版本)

安裝步驟

1. 配置 my.cnf 降低最小詞長

[mysqld]
ft_min_word_len = 1  -- 預設 4,中文單字多為 1-2 字,必須改為 1

修改後**重啟 MySQL** 生效。

2. 確認 plugin_dir 路徑

mysql> SHOW VARIABLES LIKE 'plugin_dir';
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| plugin_dir    | /usr/lib/mysql/plugin/    |
+---------------+---------------------------+

3. 下載並部署插件

  • 專案地址:https://code.google.com/archive/p/mysqlcft/ (或 GitHub 鏡像)
  • 下載對應版本:`mysqlcft.so` (Linux 64位) 或 `mysqlcft.dll` (Windows)
  • 複製到 `plugin_dir` 目錄:
cp mysqlcft.so /usr/lib/mysql/plugin/
chown mysql:mysql /usr/lib/mysql/plugin/mysqlcft.so
chmod 755 /usr/lib/mysql/plugin/mysqlcft.so

4. 安裝插件

mysql> INSTALL PLUGIN mysqlcft SONAME 'mysqlcft.so';
Query OK, 0 rows affected (0.01 sec)

5. 驗證安裝

mysql> SHOW PLUGINS;
+-----------+----------+----------------+---------+---------+
| Name      | Status   | Type           | Library | License |
+-----------+----------+----------------+---------+---------+
| mysqlcft  | ACTIVE   | FTPARSER       | mysqlcft.so | GPL     |
+-----------+----------+----------------+---------+---------+

**Status = ACTIVE、Type = FTPARSER** 表示安裝成功。

建立中文全文索引

單欄全文索引

ALTER IGNORE TABLE `db_name`.`table_name` 
ADD FULLTEXT INDEX `idx_title` (`title`) WITH PARSER mysqlcft;

多欄聯合全文索引

ALTER IGNORE TABLE `db_name`.`table_name` 
ADD FULLTEXT INDEX `idx_title_content` (`title`, `content`) WITH PARSER mysqlcft;
⚠ 重要:`WITH PARSER mysqlcft` 是關鍵,指定使用中文分詞解析器。`IGNORE` 可跳過重複鍵錯誤 (如已有同名索引)。

中文全文搜尋查詢語法

自然語言模式 (預設,相關性排序)

SELECT * FROM `table_name` 
WHERE MATCH(`title`) AGAINST('北京' IN NATURAL LANGUAGE MODE);

布林模式 (支援運算符,推薦精確控制)

-- 必須包含「北京」
SELECT * FROM `table_name` 
WHERE MATCH(`title`) AGAINST('+北京' IN BOOLEAN MODE);

-- 包含「北京」但不包含「上海」
SELECT * FROM `table_name` 
WHERE MATCH(`title`) AGAINST('+北京 -上海' IN BOOLEAN MODE);

-- 通配符搜尋 (以「北」開頭)
SELECT * FROM `table_name` 
WHERE MATCH(`title`) AGAINST('北*' IN BOOLEAN MODE);

布林模式運算符速查

運算符含義範例
+必須包含+北京
-必須不包含-上海
*通配符 (僅尾部)北*
"精確短語"北京市"
()分組+(北京 上海) -廣州
~降低相關性~北京

卸載插件 (升級/移除時)

-- 1. 先刪除所有使用 mysqlcft 的全文索引
DROP INDEX `idx_title` ON `db_name`.`table_name`;

-- 2. 卸載插件
UNINSTALL PLUGIN mysqlcft;

效能與限制

項目說明
索引大小約原文 2-3 倍 (分詞後詞元增加)
寫入效能INSERT/UPDATE 稍慢 (需分詞建索引)
查詢效能百萬級資料 < 100ms (有索引支援)
分詞準確度基於詞典,專業術語/新詞可能需自定義詞典
不支援功能ngram 模式、拼音搜尋、同義詞擴展

進階替代方案比較

方案優點缺點適用場景
mysqlcft 插件原生 SQL、零架構依賴、輕量分詞準確度有限、無拼音/同義詞、維護停滯中小型專案、簡單中文搜尋、不想引入外部服務
MySQL 5.7+ 內建 ngram parser官方支援、無需編譯、支援中日韓基於 n-gram 非語義分詞、索引大、精確度一般MySQL 5.7+、不想編譯插件、接受 n-gram 特性
Elasticsearch + IK 分詞器專業搜尋引擎、語義分詞、同義詞、高亮、聚合架構複雜、需同步資料、運維成本高大型應用、複雜搜尋需求、推薦/聚合分析
Sphinx / Manticore Search專為 SQL 設計、增量索引、支援中文分詞需額外部署、查詢語法非標準 SQL傳統 PHP/Java 專案、需高效能全文搜尋

MySQL 5.7+ 內建 ngram 方案快速上手 (無需編譯插件)

[mysqld]
ngram_token_size = 2  -- 2-gram,預設 2,可設 1-10

-- 建立索引
ALTER TABLE `table` ADD FULLTEXT INDEX `idx_content` (`content`) WITH PARSER ngram;

-- 查詢 (自然語言模式)
SELECT * FROM `table` WHERE MATCH(`content`) AGAINST('北京' IN NATURAL LANGUAGE MODE);

若專案可升級至 MySQL 5.7+,**強烈建議優先使用內建 ngram parser**,免去編譯相容性問題,官方長期維護更有保障。mysqlcft 適合舊版本 MySQL (5.1/5.5/5.6) 且無法升級的存量系統維護場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved