MySQL 的全文檢索功能只有少數使用者可調整的參數。如果您有 MySQL 原始程式碼發行版本,您可以對全文檢索行為進行更多控制,因為某些變更需要修改原始程式碼。請參閱第 2.8 節,「從原始碼安裝 MySQL」。
全文檢索經過仔細調整以提高效能。在大多數情況下,修改預設行為實際上會降低效能。除非您知道自己在做什麼,否則請勿變更 MySQL 原始程式碼。
本節中描述的大多數全文檢索變數必須在伺服器啟動時設定。需要重新啟動伺服器才能變更它們;它們無法在伺服器執行時修改。
某些變數變更需要您重建資料表中的 FULLTEXT
索引。相關說明將在本節稍後提供。
要建立索引的最小和最大字詞長度由 InnoDB
搜尋索引的 innodb_ft_min_token_size
和 innodb_ft_max_token_size
,以及 MyISAM
搜尋索引的 ft_min_word_len
和 ft_max_word_len
定義。
最小和最大字詞長度全文檢索參數不適用於使用 ngram 剖析器建立的 FULLTEXT
索引。ngram 符記大小由 ngram_token_size
選項定義。
變更任何這些選項後,請重建您的 FULLTEXT
索引,以使變更生效。例如,若要使兩個字元的字詞可搜尋,您可以將下列幾行放入選項檔案中
[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2
然後重新啟動伺服器並重建您的 FULLTEXT
索引。對於 MyISAM
資料表,請注意後續重建 MyISAM
全文索引的指示中關於 myisamchk 的註解。
對於 MyISAM
搜尋索引,自然語言搜尋的 50% 臨界值是由選取的特定加權配置決定。若要停用它,請在 storage/myisam/ftdefs.h
中尋找下列這行
#define GWS_IN_USE GWS_PROB
將該行變更為以下內容
#define GWS_IN_USE GWS_FREQ
然後重新編譯 MySQL。在這種情況下,無需重建索引。
透過進行此變更,您會嚴重降低 MySQL 為 MATCH()
函數提供適當關聯性值的能力。如果您真的需要搜尋此類常見字詞,最好改為使用 IN BOOLEAN MODE
進行搜尋,它不會觀察 50% 的臨界值。
若要變更用於 MyISAM
資料表上的布林全文檢索的運算子,請設定 ft_boolean_syntax
系統變數。(InnoDB
沒有對等的設定。)此變數可以在伺服器執行時變更,但您必須具有足夠的權限才能設定全域系統變數(請參閱第 7.1.9.1 節,「系統變數權限」)。在這種情況下,無需重建索引。
對於內建的全文剖析器,您可以透過幾種方式變更被視為字詞字元的字元集,如下列清單中所述。進行修改後,請重建包含任何 FULLTEXT
索引的每個資料表的索引。假設您想要將連字號字元 ('-') 視為字詞字元。請使用下列其中一種方法
修改 MySQL 原始程式碼:在
storage/innobase/handler/ha_innodb.cc
(適用於InnoDB
) 或在storage/myisam/ftdefs.h
(適用於MyISAM
) 中,請參閱true_word_char()
和misc_word_char()
巨集。將'-'
新增至其中一個巨集並重新編譯 MySQL。修改字元集檔案:這不需要重新編譯。
true_word_char()
巨集使用「字元類型」表格來區分字母和數字與其他字元。. 您可以編輯其中一個字元集 XML 檔案中的<ctype><map>
陣列的內容,以指定'-'
為「字母」。然後對您的FULLTEXT
索引使用給定的字元集。如需<ctype><map>
陣列格式的相關資訊,請參閱第 12.13.1 節,「字元定義陣列」。為索引欄位使用的字元集新增一個新的排序規則,並變更欄位以使用該排序規則。關於新增排序規則的一般資訊,請參閱第 12.14 節,「將排序規則新增至字元集」。關於全文索引的特定範例,請參閱第 14.9.7 節,「為全文索引新增使用者定義的排序規則」。
為了使變更生效,在修改以下任何全文索引變數後,必須重建 FULLTEXT
索引:innodb_ft_min_token_size
;innodb_ft_max_token_size
;innodb_ft_server_stopword_table
;innodb_ft_user_stopword_table
;innodb_ft_enable_stopword
;ngram_token_size
。修改 innodb_ft_min_token_size
、innodb_ft_max_token_size
或 ngram_token_size
需要重新啟動伺服器。
若要為 InnoDB
資料表重建 FULLTEXT
索引,請使用 ALTER TABLE
以及 DROP INDEX
和 ADD INDEX
選項來捨棄並重新建立每個索引。
對具有全文索引的資料表執行 OPTIMIZE TABLE
會重建全文索引,移除已刪除的文件 ID,並在可能的情況下合併同一個字詞的多個條目。
若要最佳化全文索引,請啟用 innodb_optimize_fulltext_only
並執行 OPTIMIZE TABLE
。
mysql> set GLOBAL innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.01 sec)
mysql> OPTIMIZE TABLE opening_lines;
+--------------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------+----------+----------+----------+
| test.opening_lines | optimize | status | OK |
+--------------------+----------+----------+----------+
1 row in set (0.01 sec)
若要避免大型資料表的全文索引重建時間過長,您可以使用 innodb_ft_num_word_optimize
選項來分階段執行最佳化。innodb_ft_num_word_optimize
選項定義每次執行 OPTIMIZE TABLE
時要最佳化的字詞數量。預設設定為 2000,這表示每次執行 OPTIMIZE TABLE
時會最佳化 2000 個字詞。後續的 OPTIMIZE TABLE
作業會從前一個 OPTIMIZE TABLE
作業結束的地方繼續執行。
如果您修改影響索引的全文變數 (ft_min_word_len
、ft_max_word_len
或 ft_stopword_file
),或者如果您變更了停用字檔案本身,則在進行變更並重新啟動伺服器後,必須重建 FULLTEXT
索引。
若要為 MyISAM
資料表重建 FULLTEXT
索引,執行 QUICK
修復操作就足夠了
mysql> REPAIR TABLE tbl_name QUICK;
或者,使用如前所述的 ALTER TABLE
。在某些情況下,這可能會比修復操作更快。
必須如剛才所示修復包含任何 FULLTEXT
索引的每個資料表。否則,資料表的查詢可能會產生不正確的結果,且對資料表的修改會導致伺服器將資料表視為損毀且需要修復。
如果您使用 myisamchk 來執行修改 MyISAM
資料表索引的操作 (例如修復或分析),則會使用最小字詞長度、最大字詞長度及停用字檔案的預設全文參數值重建 FULLTEXT
索引,除非您另行指定。這可能會導致查詢失敗。
發生此問題的原因是這些參數僅為伺服器所知。它們並未儲存在 MyISAM
索引檔案中。如果您已修改伺服器使用的最小或最大字詞長度或停用字檔案值,若要避免此問題,請為您用於 mysqld 的 myisamchk 指定相同的 ft_min_word_len
、ft_max_word_len
和 ft_stopword_file
值。例如,如果您已將最小字詞長度設定為 3,則可以使用 myisamchk 以這種方式修復資料表
myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
若要確保 myisamchk 和伺服器使用相同的全文參數值,請將每個參數都放在選項檔案的 [mysqld]
和 [myisamchk]
區段中
[mysqld]
ft_min_word_len=3
[myisamchk]
ft_min_word_len=3
用於 MyISAM
資料表索引修改的 myisamchk 的替代方法是使用 REPAIR TABLE
、ANALYZE TABLE
、OPTIMIZE TABLE
或 ALTER TABLE
陳述式。這些陳述式由伺服器執行,伺服器知道要使用的正確全文參數值。