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

MySQL 全文搜索完整指南:原理、語法與實戰優化

     編輯:MySQL 資料庫相關知識

什麼是 MySQL 全文索引?

全文索引是 MySQL 中一種特殊的 FULLTEXT 類型索引,專門用於對文本數據進行高效的自然語言搜索。它主要應用於 MyISAM 表(MySQL 5.6+ 也支持 InnoDB),可在 CREATE TABLE 時定義,或通過 ALTER TABLE / CREATE INDEX 後續添加至 CHAR、VARCHAR 或 TEXT 列上。

性能提示: 對於大數據量表,建議先導入數據,再創建全文索引,速度遠快於先建索引再導入數據。

核心函數:MATCH() ... AGAINST()

全文搜索通過 MATCH() 函數實現,語法如下:

SELECT * FROM table_name
WHERE MATCH (col1, col2, ...) AGAINST ('search_string');
  • 自然語言模式(默認): 忽略大小寫,按相關性降序排序,返回非負浮點數相關性值。
  • 布爾模式: 使用 IN BOOLEAN MODE 修飾符,支持 +(必須包含)、-(必須排除)、>/<(調整權重)、()(分組)、~(降低權重)、*(通配符)、""(精確短語)等操作符。

實戰範例

1. 建表示例表並插入數據

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title, body)
) ENGINE=MyISAM;

INSERT INTO articles VALUES
(NULL, 'MySQL Tutorial', 'DBMS stands for DataBase ...'),
(NULL, 'How To Use MySQL Efficiently', 'After you went through a ...'),
(NULL, 'Optimising MySQL', 'In this tutorial we will show ...'),
(NULL, '1001 MySQL Tricks', '1. Never run MySQLd as root. 2. ...'),
(NULL, 'MySQL vs. YourSQL', 'In the following database comparison ...'),
(NULL, 'MySQL Security', 'When configured properly, MySQL ...');

2. 自然語言搜索

SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('database');
-- 返回包含 "database" 的記錄,按相關性排序

3. 顯式獲取相關性分值

SELECT id, MATCH (title, body) AGAINST ('Tutorial') AS score
FROM articles;

4. 布爾模式搜索

SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
-- 必須包含 MySQL,且不包含 YourSQL,不受 50% 閾值限制

關鍵機制與限制

詞的定義與停用詞

  • 「詞」由字母、數字、' 和 _ 組成。
  • 長度 ≤ 3 的詞、出現在停用詞列表中的詞會被忽略。
  • 出現在超過 50% 記錄中的詞會被視為停用詞(自然語言模式),這是為了避免返回過多無關結果。

相關性計算

基於:詞在記錄中的出現次數、記錄中唯一詞數、整個集合中詞的總數、包含該詞的文檔數。

使用限制

  • MATCH() 的列必須來自同一張表,且屬於同一個 FULLTEXT 索引(布爾模式除外)。
  • MATCH() 列列表必須精確匹配索引定義的列順序(布爾模式除外)。
  • AGAINST() 參數必須是常量字符串。

進階調優參數

參數說明
ft_min_word_len被索引詞的最小長度(默認 4)
ft_stopword_file自定義停用詞文件路徑
ft_boolean_syntax布爾模式操作符集合

注意: 修改底層參數(如禁用 50% 閾值)需重新編譯 MySQL,通常建議改用布爾模式而非調整核心邏輯。

待辦功能(官方 TODO)

  • 鄰近度操作符
  • 支持「始終索引詞」(如 C++、TCP/IP)
  • 多字節字符集支持
  • 基於語言的詞幹提取
  • 更靈活的 FULLTEXT 可調參數

總結

MySQL 全文搜索為中小型應用提供了開箱即用的文本檢索能力。理解其自然語言與布爾模式的差異、50% 閾值機制、詞切分規則,能幫助開發者避開常見坑點。大規模或高並發場景下,建議引入 Elasticsearch 等專業搜索引擎。

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