首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

MySQL 全文搜索完整指南:自然語言模式、布爾模式、配置調優與限制

     編輯:PHP 綜合知識

全文索引基礎

  • 支持引擎:MyISAM(MySQL 5.6+ InnoDB 也支持)。
  • 適用列類型:CHAR、VARCHAR、TEXT。
  • 創建方式:
    • 建表時:FULLTEXT (title, body)
    • 後添加:ALTER TABLE articles ADD FULLTEXT (title, body) 或 CREATE FULLTEXT INDEX idx_title_body ON articles (title, body)
  • 大數據導入技巧:先導數據、後建索引(極快);帶索引導入極慢。

自然語言模式(默認)

SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('database');
  • 不區分大小寫。
  • 返回結果按**相關性降序**排列。
  • 相關性算法:詞頻(TF)、逆文檔頻率(IDF)、文檔長度歸一化。
  • 50% 閾值限制:若搜索詞出現在 ≥50% 行中,視為「常用詞」自動忽略(相關性 0)。示例:表中 6 行,「MySQL」出現 3 次以上 → 搜索 "MySQL" 返回空集。
  • 最小詞長 ft_min_word_len(默認 4),停用詞表 ft_stopword_file。

布爾模式(IN BOOLEAN MODE)

SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
  • 無 50% 閾值,可搜索高頻詞。
  • 不自動按相關性排序,需手動 ORDER BY MATCH(...) AGAINST(...) DESC。
  • 支持操作符:
    操作符含義
    +必須包含
    -必須不包含
    > / <增加/降低權重
    ()分組
    ~負權重(降噪,不完全排除)
    *通配符(僅作後綴,如 apple*)
    ""短語精確匹配
  • 無全文索引也可工作(全表掃描,極慢)。

實用查詢示例

需求查詢
包含 "apple" 和 "juice"+apple +juice
包含 "apple",若也含 "macintosh" 則權重更高+apple macintosh
包含 "apple" 但不含 "macintosh"+apple -macintosh
包含 "apple" 且 ("pie" 或 "strudel"),"apple pie" 權重更高+apple +(>pie <strudel)
以 "apple" 開頭的詞apple*
精確短語 "some words""some words"

配置調優(需重建索引生效)

  • ft_min_word_len:最小詞長(默認 4),改為 1 可索引單字母,修改後 REPAIR TABLE tbl QUICK。
  • ft_stopword_file:自定義停用詞文件路徑,修改後重建索引。
  • 禁用 50% 閾值:修改源碼 myisam/ftdefs.h #define GWS_IN_USE GWS_PROB → GWS_FREQ,重新編譯 MySQL(**不推薦**,改用布爾模式)。
  • ft_boolean_syntax:布爾操作符字符串(只讀,源碼 myisam/ft_static.c 定義)。

限制與注意事項

  • MATCH() 列列表必須**精確匹配**某個全文索引的列定義(除非布爾模式)。
  • AGAINST() 參數必須是**常量字符串**,不能用列/變量。
  • 多字節字符集(UTF-8 中文)在早期版本分詞不準,5.7+ 引入 ngram parser 解決:FULLTEXT INDEX idx (col) WITH PARSER ngram。
  • 不支持 MERGE 表、不支持近接搜索、無詞幹提取。

重建索引命令

REPAIR TABLE articles QUICK;

總結

MySQL 全文搜索適合**中小規模、中文分詞需求不極致**的場景。大規模、高精度、實時性要求高的系統建議接入 Elasticsearch、Solr、Meilisearch 或 PostgreSQL pg_trgm/zhparser。理解自然語言模式的 50% 閾值、布爾模式操作符、最小詞長配置,是用好 MySQL 全文搜索的關鍵。

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