SELECT * FROM articles WHERE content LIKE '%keyword%':
+ 必含、- 必不含、* 萬用字元、"" 精確片語、>/< 權重調整。-- 1. 建立範例表
CREATE TABLE reviews (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. 插入測試資料
INSERT INTO reviews (content) VALUES
('Gingerboy has a new single out called Throwing Rocks. It\'s great!'),
('Hello all, I really like the new Madonna single. One of the hottest tracks currently playing...'),
('Have you heard the new band Hotter Than Hell? They have five members and they burn their instruments when they play in concerts.');
-- 3. 建立 FULLTEXT 索引
ALTER TABLE reviews ADD FULLTEXT INDEX ft_content (content);
-- 4. 驗證索引
SHOW INDEX FROM reviews WHERE Key_name = 'ft_content';
SELECT id, content,
MATCH(content) AGAINST('new single' IN NATURAL LANGUAGE MODE) AS relevance
FROM reviews
WHERE MATCH(content) AGAINST('new single' IN NATURAL LANGUAGE MODE)
ORDER BY relevance DESC;
ft_min_word_len),可調整需重建索引。-- 必須包含 new,必須包含 single,排除 Madonna
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('+new +single -Madonna' IN BOOLEAN MODE);
-- 精確片語搜尋
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('"Throwing Rocks"' IN BOOLEAN MODE);
-- 萬用字元(詞幹搜尋)
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('play*' IN BOOLEAN MODE);
-- 匹配 play, playing, played...
-- 權重調整
SELECT * FROM reviews
WHERE MATCH(content) AGAINST('>new
utf8mb4,避免分詞錯誤。ft_stopword_file = /etc/mysql/stopwords.txt,業務專有名詞勿被過濾。ft_min_word_len = 1 或 2,配合 ngram 解析器(MySQL 5.7.6+)。ngram 解析器(WITH PARSER ngram)。ALTER TABLE ... ADD FULLTEXT INDEX,避免逐筆維護索引開銷。EXPLAIN SELECT * FROM reviews
WHERE MATCH(content) AGAINST('+new +single' IN BOOLEAN MODE);
-- type=fulltext, key=ft_content, rows=1 (理想)
MATCH() AGAINST() 在 WHERE 與 SELECT 列表中參數必須完全一致,才能複用索引計算。IN NATURAL LANGUAGE MODE 不支援 +/- 操作符。