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
索引檔案中。若要避免問題,如果您已修改伺服器使用的最小或最大字詞長度或停止詞檔案值,請為 myisamchk 指定與您用於 mysqld 的相同的 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
除了使用 myisamchk 修改 MyISAM
資料表索引之外,您也可以使用 REPAIR TABLE
、ANALYZE TABLE
、OPTIMIZE TABLE
或 ALTER TABLE
陳述式。這些陳述式是由伺服器執行,伺服器知道要使用的正確全文參數值。