CHAR、VARCHAR、TEXT 及其衍生類型[mysqld]
# 1. 降低最小詞長(支持單字)
ft_min_word_len = 1
# 2. 指定字符集與詞典(需 MySQL 編譯時包含或插件支持)
ft_wordlist_charset = gbk # 或 utf8
# ft_wordlist_file = /path/to/wordlist-gbk.txt
# ft_stopword_file = /path/to/stopwords-gbk.txt
# 3. 重啟後必須重建索引
REPAIR TABLE articles QUICK;
注意:原生 MySQL 全文索引對中文分詞支持極弱,實際生產建議改用下文插件方案。
-- 建表時創建
CREATE TABLE articles (
id INT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT INDEX ft_title_content (title, content)
) ENGINE=InnoDB;
-- 既有表添加
ALTER TABLE articles ADD FULLTEXT INDEX ft_tags (tags);
-- 基礎查詢(自然語言模式,按相關性排序)
SELECT *, MATCH(title, content) AGAINST('MySQL 優化') AS relevance
FROM articles
WHERE MATCH(title, content) AGAINST('MySQL 優化')
ORDER BY relevance DESC;
-- 布爾模式(精確控制邏輯)
SELECT * FROM articles
WHERE MATCH(tags) AGAINST('+旅游 -景點' IN BOOLEAN MODE); -- 必含旅游、排除景點
| 操作符 | 含義 | 示例 |
|---|---|---|
| + | 必須包含 | +MySQL |
| - | 必須不包含 | -Oracle |
| > | 提高相關性 | >性能 <調優 |
| < | 降低相關性 | <入門 |
| () | 分組 | +(MySQL 數據庫) |
| ~ | 模糊/降權 | ~教程 |
| * | 通配符(僅尾部) | MySQL* |
| "" | 精確短語 | "存儲引擎" |
| 方案 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| MySQL 原生 | ngram/內置解析器 | 零依賴、SQL 無縫集成 | 分詞粗糙、相關性差、無同義詞 | 極簡場景、數據量小 |
| Mroonga 插件 | Groonga 全文引擎 | 真正中文分詞、支持同義詞、高性能 | 需編譯安裝、運維成本高 | 中型業務、追求原生體驗 |
| Elasticsearch | 倒排索引 + IK/智能分詞 | 專業搜索引擎、功能最全、水平擴展 | 架構複雜、數據同步延遲 | 大型業務、複雜搜索需求 |
| Sphinx/Searchd | 專用全文檢索服務 | 高性能、SQL 接口、增量索引 | 社區活躍度下降 | 傳統項目遷移 |
-- 創建表指定 ngram parser
CREATE TABLE articles_ngram (
id INT PRIMARY KEY,
content TEXT,
FULLTEXT INDEX ft_content (content) WITH PARSER ngram
) ENGINE=InnoDB;
-- 查詢自動按 bigram 分詞
SELECT * FROM articles_ngram
WHERE MATCH(content) AGAINST('數據庫優化' IN NATURAL LANGUAGE MODE);
ngram 將中文按雙字切分("數據庫優化" → "數據" "據庫" "庫優" "優化"),召回率高但精度一般,配合布爾模式 +"數據庫" +"優化" 可提升精度。
ft_stopword_fileMATCH() 列順序:必須與索引定義列一致(布爾模式可單列)中文全文搜索無銀彈,根據業務規模與複雜度選型:小項目用 ngram,中型上 Mroonga,大型直奔 Elasticsearch。