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

MySQL 5.7 內建 ngram 中文全文檢索完整指南:配置、分詞、三大搜尋模式實戰

     編輯:MySQL 資料庫相關知識

背景

MySQL 早期全文檢索僅支援空格分詞 (英文),中文需外掛 (MeCab 等)。5.7 內建 **ngram parser**,支援 MyISAM/InnoDB,無額外安裝。

核心配置


[mysqld]
ngram_token_size=2  -- 分詞粒度 (1~10),2=雙字元 (推薦平衡精度/索引大小)

修改後**重啟生效**,現有全文索引需 `REPAIR TABLE` 或 `ALTER TABLE ... DROP INDEX ... ADD FULLTEXT ...` 重建。

建表示例


CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title, body) WITH PARSER ngram
) ENGINE=InnoDB CHARACTER SET utf8mb4;

測試資料 (6 筆)


INSERT INTO articles (title, body) VALUES
('數據庫管理', '在本教程中我將向你展示如何管理數據庫'),
('數據庫應用開發', '學習開發數據庫應用程序'),
('MySQL完全手冊', '學習MySQL的一切'),
('數據庫與事務處理', '系統的學習數據庫的事務概論'),
('NoSQL精髓', '學習了解各種非結構化數據庫'),
('SQL 語言詳解', '詳細了解如果使用各種SQL');

檢視分詞結果 (內部索引)


SET GLOBAL innodb_ft_aux_table = 'test/articles';  -- 指定分析目標表
SELECT * FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20, 10;

輸出範例 (ngram_token_size=2):`數據`、`據庫`、`庫管`、`管理`... 每兩字一組,含 `DOC_ID`、`POSITION` 等位置資訊。

三大搜尋模式實戰

1. 自然語言模式 (Natural Language) - 相關性排序


-- 符合筆數
SELECT COUNT(*) FROM articles 
WHERE MATCH(title, body) AGAINST('數據庫' IN NATURAL LANGUAGE MODE);
-- 結果: 4

-- 相關性分數
SELECT id, MATCH(title, body) AGAINST('數據庫' IN NATURAL LANGUAGE MODE) AS score
FROM articles;
-- id=1,2,4 分數 0.124;id=5 分數 0.062 (僅 body 含);id=3,6 分數 0

2. 布林模式 (Boolean) - 精確邏輯控制


-- 必須同時包含「數據庫」和「管理」
SELECT * FROM articles 
WHERE MATCH(title, body) AGAINST('+數據庫 +管理' IN BOOLEAN MODE);
-- 僅 id=1

-- 包含「數據庫」但排除「管理」
SELECT * FROM articles 
WHERE MATCH(title, body) AGAINST('+數據庫 -管理' IN BOOLEAN MODE);
-- id=2,4,5

-- 提升「MySQL」權重,降低「數據庫」權重
SELECT * FROM articles 
WHERE MATCH(title, body) AGAINST('>數據庫 +MySQL' IN BOOLEAN MODE);
-- 僅 id=3 (MySQL完全手冊)

3. 查詢擴展模式 (Query Expansion) - 語義擴展


SELECT * FROM articles 
WHERE MATCH(title, body) AGAINST('數據庫' WITH QUERY EXPANSION);
-- 兩階段:先自然語言搜尋 → 取高相關文檔關鍵詞 → 二次搜尋
-- 結果: 6 筆全命中 (含 MySQL、SQL、NoSQL 等相關詞擴展)

操作符對照 (Boolean 模式)

操作符含義範例
+必須包含+數據庫
-必須不包含-管理
>提高相關性>數據庫
<降低相關性<管理
()分組+(數據庫 管理)
~模糊/否定貢獻~噪音詞
*前綴通配 (僅詞尾)數據*
""精確短語"數據庫管理"

效能與最佳實踐

  • ngram_token_size:2=雙字元 (索引約單字 2 倍)、3=三字元 (精度高、索引大);根據業務平衡
  • 索引大小:中文全文索引較英文大 3-5 倍,規劃儲存空間
  • 停用詞:MySQL 內建停用詞表對中文效果有限,可自訂 `ft_stopword_file`
  • 最小詞長:`ft_min_word_len` 對 ngram 無效,由 `ngram_token_size` 決定
  • 大數據量:考慮 Elasticsearch/Solr 專用搜尋引擎,MySQL 全文檢索適合中小型、低併發場景

版本演進

  • MySQL 5.7.6+:ngram 正式 GA
  • MySQL 8.0:效能優化、支援 `WITH PARSER ngram` 於 `ALTER TABLE ... ADD FULLTEXT`
  • MariaDB 10.0+:同樣內建 ngram

MySQL 5.7 內建 ngram 讓中文全文檢索零依賴、零部署,三大搜尋模式覆蓋從相關性排序到精確邏輯再到語義擴展的主流需求,是中小型應用快速上線中文搜尋的最佳選擇。

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