MySQL創建全文索引時,不添加/*!50100 WITH PARSER `ngram` */,查詢不到結果
在 MySQL 中創建全文索引時,如果不添加 /*!50100 WITH PARSERngram*/(即明確指定使用 ngram解析器),導致索引對中文或混合內容失效的根本原因如下:
1. ??默認解析器不適用于中文分詞??
MySQL 內置的默認全文解析器基于??空格和標點??進行分詞(拉丁語系規則),而中文、日文等語言沒有自然分隔符。因此,默認解析器會將整段中文視為一個連續的字符串,無法拆解成有意義的詞語。
??示例??:
對文本 "全文索引",默認解析器無法識別 "全文"或 "索引"等子詞,導致搜索 "全文"無結果。
而 ngram解析器會按 ngram_token_size(默認值為 2)切分為 "全文"、"文索"、"索引",從而支持匹配。
2. ??ngram解析器是支持中文的必要條件??
從 ??MySQL 5.7.6 開始??,官方引入了 ngram解析器插件,專門用于支持??非空格分隔語言??(如中文)的分詞。
若不顯式指定 WITH PARSER ngram,MySQL 會使用默認解析器,生成的索引僅能處理英文或數字,無法正確索引中文內容。
3. ??配置參數依賴 ngram解析器??
與分詞相關的參數(如 ngram_token_size)??僅在啟用 ngram解析器時生效??。若未指定解析器:
innodb_ft_min_token_size(最小詞長)和 innodb_ft_max_token_size(最大詞長)等參數對中文無效;
默認解析器會忽略長度小于 3或大于 84的單詞,但中文單字長度固定為 1,導致大部分詞被忽略。
4. ??停用詞處理差異??
默認解析器依賴??停用詞表??(如 innodb_ft_default_stopword),但中文停用詞(如 "的"、"了")未被默認列表覆蓋。未啟用 ngram時,停用詞過濾邏輯可能誤刪有效中文詞語。
而 ngram解析器通過機械切分規避了停用詞問題(除非顯式配置自定義停用詞表)。
??解決方案:顯式啟用 ngram解析器??
-- 創建全文索引時強制指定 ngram 解析器 ALTER TABLE 表名 ADD FULLTEXT INDEX 索引名 (字段名) WITH PARSER ngram;
??輔助配置建議??
- ??調整 ngram_token_size??
在 my.cnf中設置 ngram_token_size=2(默認值,適合雙字詞),重啟 MySQL 并重建索引。
- 處理特殊符號干擾??
若字段含分號(;)、連字符(-)等符號,需將其加入??自定義停用詞表??,避免干擾分詞
CREATE TABLE custom_stopwords (value VARCHAR(30)); INSERT INTO custom_stopwords VALUES (';'), ('-'); SET GLOBAL innodb_ft_server_stopword_table = '數據庫名/custom_stopwords';
- 使用 BOOLEAN MODE提升精度??
查詢時推薦布爾模式,支持 +(必須包含)、-(排除)等操作符:
SELECT * FROM 表名 WHERE MATCH(字段) AGAINST('+關鍵詞' IN BOOLEAN MODE);
總結:
未添加 WITH PARSER ngram導致索引失效的核心原因是:??默認解析器無法處理無空格分隔的中文文本??。顯式啟用 ngram后,MySQL 才能按字符長度機械切分中文,生成有效的倒排索引。同時需配合參數調整(如 ngram_token_size)和符號過濾,才能實現精準匹配。
本文來自博客園,作者:業余磚家,轉載請注明原文鏈接:http://www.rzrgm.cn/yeyuzhuanjia/p/19048314

浙公網安備 33010602011771號