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

MySQL 全文搜索 MATCH AGAINST 實戰與中文分詞方案

     編輯:MySQL 資料庫相關知識

全文索引前置條件

  • 存儲引擎:MyISAM(5.6 前)或 InnoDB(5.6+)
  • 字段類型:CHAR、VARCHAR、TEXT 及其衍生類型
  • 最小詞長:默認 4 字節,中文單字需改為 1-2

配置中文分詞支持(關鍵步驟)

[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 接口、增量索引社區活躍度下降傳統項目遷移

MySQL 5.7+ 內置 ngram 解析器實戰

-- 創建表指定 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 將中文按雙字切分("數據庫優化" → "數據" "據庫" "庫優" "優化"),召回率高但精度一般,配合布爾模式 +"數據庫" +"優化" 可提升精度。

避坑指南

  1. 大數據導入:先導數據、後建全文索引,速度快數量級
  2. 停用詞表:默認英文停用詞對中文無效,需自定義 ft_stopword_file
  3. MATCH() 列順序:必須與索引定義列一致(布爾模式可單列)
  4. 相關性分數:僅供排序參考,業務勿依賴絕對閾值
  5. InnoDB 全文索引:5.6+ 支持,但修改操作會同步更新索引,高寫入場景評估性能

中文全文搜索無銀彈,根據業務規模與複雜度選型:小項目用 ngram,中型上 Mroonga,大型直奔 Elasticsearch。

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