mysql中文全文索引的記錄

C羽言發表於2024-04-14

在MySQL 5.7.6之前,全文索引只支援英文全文索引,不支援中文全文索引,需要利用分詞器把中文段落預處理拆分成單詞,然後存入資料庫。
從MySQL 5.7.6開始,MySQL內建了ngram全文解析器,用來支援中文、日文、韓文分詞。

建立示例

-- 建立表格
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT
);
-- 新增全文索引 
-- 使用WITH PARSER ngram語句建立全文索引時,可以指定使用ngram分詞器。
ALTER TABLE articles ADD FULLTEXT INDEX idx_content (content) WITH PARSER ngram;

-- 執行全文搜尋
SELECT * FROM articles WHERE MATCH(content) AGAINST('你要搜尋的關鍵詞');

配置引數

ft_min_word_len

ft_min_word_len 預設值為 4 ,MySQL 將不會為長度小於 4 的詞構建全文索引。

舉個例子,假設你有一篇包含短詞的文章,比如 "The cat is on the mat.",而 ft_min_word_len 設定為 4。在這種情況下,諸如 "the", "cat", "is", "on", "the", "mat" 這樣的短詞將不會被包括在全文索引中。因此,如果你搜尋 "the",你將無法找到任何匹配,因為 "the" 這個詞在索引中不存在。

--顯示當前 MySQL 例項中 ft_min_word_len 的設定值
SHOW VARIABLES LIKE 'ft_min_word_len';

如果你希望更改 ft_min_word_len 的值,你可以透過修改 MySQL 配置檔案(通常是 my.cnfmy.ini)來實現。找到 ft_min_word_len 引數所在的部分,並將其設定為你想要的值,然後重新啟動 MySQL 服務使更改生效。

也可以用命令實現

--長度改為2
SET GLOBAL ft_min_word_len = 2;
--重新構建全文索引,以便新的設定生效
ALTER TABLE your_table_name ENGINE=MyISAM;

根據我的實測,這個引數對中文並沒有影響,因為我在建立索引時指定使用ngram分詞器。

與預設的全文索引相比,使用 N-gram 解析器建立的全文索引可以搜尋到更短的詞語,因為它會將文字分成連續的字元片段作為詞條。這意味著即使詞語的長度小於 ft_min_word_len 引數的值,它們仍然可以被搜尋到。

ngram_token_size

MySQL 中使用全域性變數ngram_token_size來配置ngram中n的大小,它的取值範圍是1到10,預設值是2。通常ngram_token_size設定為要查詢的單詞的最小字數。如果需要搜尋單字,就要把ngram_token_size設定為1。在預設值是2的情況下,搜尋單字是得不到任何結果的。因為中文單詞最少是兩個漢字,推薦使用預設值2。如果你想查詢到單個字,那麼我們需要設定為1。ngram_token_size的值設定的越小,全文索引佔用的空間也越小。一般來說,查詢正好等於ngram_token_size的詞,速度會更快,但是查詢比它更長的詞或短語,則會變慢。

-- 顯示ngram_token_size的值
show VARIABLES like 'ngram_token_size';

修改方法:在my.ini檔案下的 [mysqld] 下面加上 ngram_token_size = 2 即可,當然也可以設定成1。如果是Linux系統則修改my.cnf檔案。

索引問題

上面建立的示例中只有content設定了全文索引,要同時查詢2個欄位,就需要同時對2個欄位進行索引,而不是單獨再給title欄位索引。

-- 刪除現有的全文索引
ALTER TABLE articles DROP INDEX idx_content;
-- 新增2個欄位的全文索引
ALTER TABLE articles ADD FULLTEXT INDEX idx_title_content (title, content) WITH PARSER ngram;

相關文章