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


MySQL 9.0 參考手冊  /  ...  /  微調 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 索引檔案中。若要避免問題,如果您已修改伺服器使用的最小或最大字詞長度或停止詞檔案值,請為 myisamchk 指定與您用於 mysqld 的相同的 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

除了使用 myisamchk 修改 MyISAM 資料表索引之外,您也可以使用 REPAIR TABLEANALYZE TABLEOPTIMIZE TABLEALTER TABLE 陳述式。這些陳述式是由伺服器執行,伺服器知道要使用的正確全文參數值。