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

MySQL 全文搜索完整指南:MATCH AGAINST 自然語言、布林與查詢擴展模式

     編輯:MySQL 資料庫相關知識

核心語法

MATCH (col1, col2, ...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])

建立全文索引

  • 僅支援 MyISAM 引擎(MySQL 5.6+ InnoDB 也支援)
  • 適用欄位類型:CHAR、VARCHAR、TEXT
  • 建表時建立:FULLTEXT (title, body)
  • 事後新增:ALTER TABLE ADD FULLTEXT idx_name (col1, col2)

大數據量建索引技巧

先匯入資料 → 再建立 FULLTEXT 索引,速度遠快於邊匯入邊建索引。

三種搜尋模式

1. 自然語言模式(預設)

SELECT * FROM articles 
WHERE MATCH (title, body) AGAINST ('database');
  • 不分大小寫
  • 依相關性排序(高→低)
  • 相關值計算基於:詞頻、文檔頻率、唯一詞數等
  • 50% 門檻:出現在超過 50% 文檔的詞被視為停用詞,忽略不計(小資料集易誤觸)

2. 布林模式

SELECT * FROM articles 
WHERE MATCH (title, body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
操作符功能
+必須包含
-必須不包含
> / <提高/降低相關性權重
()分組子表達式
~否定權重(降噪)
*截斷符(後綴匹配)
" "精確短語匹配

特點:無 50% 門檻、不按相關性排序、可無索引工作(極慢)。

3. 查詢擴展模式

SELECT * FROM articles 
WHERE MATCH (title, body) AGAINST ('MySQL' WITH QUERY EXPANSION);

兩階段:先自然語言搜尋 → 分析高相關文檔關鍵詞 → 再次搜尋。適合關鍵詞模糊、需擴大召回的場景。

中文分詞問題

MySQL 內建分析器以空格、標點為分隔符,**無法正確切分中文**。解決方案:

  • 預處理:在中文詞彙間插入空格或特定分隔符
  • 使用第三方分詞器(如 jieba、SCWS)配合應用層分詞後存入專用欄位
  • MySQL 5.7+ 內建 ngram parser 支援中日韓分詞

效能監控

SHOW STATUS LIKE 'Handler_read_key';    -- 高表示索引生效
SHOW STATUS LIKE 'Handler_read_rnd_next'; -- 高表示全表掃描,查詢低效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved