文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  微調 MySQL 全文檢索

14.9.6 微調 MySQL 全文檢索

MySQL 的全文檢索功能只有少數使用者可調整的參數。如果您有 MySQL 原始程式碼發行版本,您可以對全文檢索行為進行更多控制,因為某些變更需要修改原始程式碼。請參閱第 2.8 節,「從原始碼安裝 MySQL」

全文檢索經過仔細調整以提高效能。在大多數情況下,修改預設行為實際上會降低效能。除非您知道自己在做什麼,否則請勿變更 MySQL 原始程式碼

本節中描述的大多數全文檢索變數必須在伺服器啟動時設定。需要重新啟動伺服器才能變更它們;它們無法在伺服器執行時修改。

某些變數變更需要您重建資料表中的 FULLTEXT 索引。相關說明將在本節稍後提供。

設定最小和最大字詞長度

要建立索引的最小和最大字詞長度由 InnoDB 搜尋索引的 innodb_ft_min_token_sizeinnodb_ft_max_token_size,以及 MyISAM 搜尋索引的 ft_min_word_lenft_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 節,「為全文索引新增使用者定義的排序規則」

重建 InnoDB 全文索引

為了使變更生效,在修改以下任何全文索引變數後,必須重建 FULLTEXT 索引:innodb_ft_min_token_sizeinnodb_ft_max_token_sizeinnodb_ft_server_stopword_tableinnodb_ft_user_stopword_tableinnodb_ft_enable_stopwordngram_token_size。修改 innodb_ft_min_token_sizeinnodb_ft_max_token_sizengram_token_size 需要重新啟動伺服器。

若要為 InnoDB 資料表重建 FULLTEXT 索引,請使用 ALTER TABLE 以及 DROP INDEXADD INDEX 選項來捨棄並重新建立每個索引。

最佳化 InnoDB 全文索引

對具有全文索引的資料表執行 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 作業結束的地方繼續執行。

重建 MyISAM 全文索引

如果您修改影響索引的全文變數 (ft_min_word_lenft_max_word_lenft_stopword_file),或者如果您變更了停用字檔案本身,則在進行變更並重新啟動伺服器後,必須重建 FULLTEXT 索引。

若要為 MyISAM 資料表重建 FULLTEXT 索引,執行 QUICK 修復操作就足夠了

mysql> REPAIR TABLE tbl_name QUICK;

或者,使用如前所述的 ALTER TABLE。在某些情況下,這可能會比修復操作更快。

必須如剛才所示修復包含任何 FULLTEXT 索引的每個資料表。否則,資料表的查詢可能會產生不正確的結果,且對資料表的修改會導致伺服器將資料表視為損毀且需要修復。

如果您使用 myisamchk 來執行修改 MyISAM 資料表索引的操作 (例如修復或分析),則會使用最小字詞長度、最大字詞長度及停用字檔案的預設全文參數值重建 FULLTEXT 索引,除非您另行指定。這可能會導致查詢失敗。

發生此問題的原因是這些參數僅為伺服器所知。它們並未儲存在 MyISAM 索引檔案中。如果您已修改伺服器使用的最小或最大字詞長度或停用字檔案值,若要避免此問題,請為您用於 mysqldmyisamchk 指定相同的 ft_min_word_lenft_max_word_lenft_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 TABLEANALYZE TABLEOPTIMIZE TABLEALTER TABLE 陳述式。這些陳述式由伺服器執行,伺服器知道要使用的正確全文參數值。