中文模糊搜索是業務系統的高頻需求,但中文無自然分詞符(空格)特性導致傳統方案效能低下。本文深度剖析三大主流方案原理、優劣勢與工程落地關鍵點,助你根據業務體量做出最優架構決策。
MySQL FULLTEXT 索引依賴「詞」邊界判斷。英文天然分詞,中文需人工構建分詞文本:將原文按分詞規則(或暴力單字)用空格分隔,存入額外字段,並在該字段建立 FULLTEXT 索引。
-- 1. 添加分詞字段
ALTER TABLE articles ADD COLUMN content_seg TEXT;
-- 2. 寫入分詞後文本(需應用層或觸發器維護)
UPDATE articles SET content_seg = '這 是 一 篇 測試 文章' WHERE id = 1;
-- 3. 建立全文索引
ALTER TABLE articles ADD FULLTEXT INDEX ft_content (content_seg);
-- 4. 查詢
SELECT * FROM articles WHERE MATCH(content_seg) AGAINST('測試 文章' IN BOOLEAN MODE);
ft_min_word_len: 默認 4,中文必須改為 1(my.cnf 中 [mysqld] ft_min_word_len=1),否則單字無法檢索。修改後需重啟並 REPAIR TABLE 重建索引FULLTEXT(title, content) 對應 MATCH(title, content)IN BOOLEAN MODE 繞過+ 必含、- 排除、"" 精確短語| 優點 | 缺點 |
|---|---|
| 原生支援、無外部依賴、效能優於 LIKE | 需額外維護分詞字段、分詞邏輯複雜、寫入性能損耗大、功能較弱(無相關度排序、同義詞、高亮等) |
代表技術:Elasticsearch(主流標配)、Sphinx/Coreseek(老牌)、迅搜(國產輕量級)。
[業務寫入] --> [MySQL 主庫] --> [同步組件] --> [搜索引擎集群]
\
--> [讀取服務] <-- [搜索 API] <-- [搜索引擎]
| 業務體量 | 推薦方案 | 理由 |
|---|---|---|
| 數據 < 10萬、QPS < 50 | LIKE + 覆蓋索引優化 | 開發成本最低,滿足基本可用 |
| 數據 10萬-500萬、中等併發 | MySQL FULLTEXT + 定時分詞同步 | 無新增組件,利用現有資源,接受寫入性能損耗 |
| 數據 > 500萬、高併發、需高級搜索功能 | Elasticsearch 集群 | 專業搜索能力、水平擴展、生態成熟 |
作者最終選擇方案三,同步邏輯交由定時任務保障,以換取搜索體驗與系統穩定性的最佳平衡。對於中大型項目,專業搜索引擎是必經之路,切勿因貪圖省事而在核心搜索鏈路使用 LIKE 或簡陋全文索引。