文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  ngram 全文解析器

14.9.8 ngram 全文解析器

內建的 MySQL 全文解析器使用單字之間的空白字元作為分隔符號,以判斷單字的開始和結束位置,這是在使用不使用單字分隔符號的表意文字語言時的限制。為了處理這個限制,MySQL 提供了一個支援中文、日文和韓文 (CJK) 的 ngram 全文解析器。ngram 全文解析器支援與 InnoDBMyISAM 搭配使用。

注意

MySQL 也提供了一個用於日文的 MeCab 全文解析器外掛程式,它會將文件權杖化為有意義的單字。如需更多資訊,請參閱第 14.9.9 節,「MeCab 全文解析器外掛程式」

ngram 是來自給定文字序列的 n 個字元的連續序列。ngram 解析器會將文字序列權杖化為 n 個字元的連續序列。例如,您可以使用 ngram 全文解析器,針對 n 的不同值將 abcd 權杖化。

n=1: 'a', 'b', 'c', 'd'
n=2: 'ab', 'bc', 'cd'
n=3: 'abc', 'bcd'
n=4: 'abcd'

ngram 全文解析器是一個內建伺服器外掛程式。如同其他內建伺服器外掛程式,它會在伺服器啟動時自動載入。

第 14.9 節,「全文搜尋函數」中所述的全文搜尋語法適用於 ngram 解析器外掛程式。此節說明了剖析行為的差異。全文相關的設定選項 (最小和最大單字長度選項除外 (innodb_ft_min_token_sizeinnodb_ft_max_token_sizeft_min_word_lenft_max_word_len)) 也適用。

設定 ngram 權杖大小

ngram 解析器的預設 ngram 權杖大小為 2 (雙連詞)。例如,使用權杖大小為 2 時,ngram 解析器會將字串 abc def 剖析為四個權杖:abbcdeef

可以使用 ngram_token_size 設定選項設定 ngram 權杖大小,其最小值為 1,最大值為 10。

通常,ngram_token_size 會設定為您想要搜尋的最大權杖大小。如果您只打算搜尋單一字元,請將 ngram_token_size 設定為 1。較小的權杖大小會產生較小的全文搜尋索引,並加快搜尋速度。如果您需要搜尋由多個字元組成的單字,請據此設定 ngram_token_size。例如,Happy Birthday 在簡體中文中是 生日快乐,其中 生日birthday,而 快乐 翻譯為 happy。若要搜尋這類雙字元單字,請將 ngram_token_size 設定為 2 或更高的值。

作為唯讀變數,ngram_token_size 只能設定為啟動字串的一部分或在設定檔中設定

  • 啟動字串

    mysqld --ngram_token_size=2
  • 設定檔

    [mysqld]
    ngram_token_size=2
注意

以下最小和最大單字長度設定選項會針對使用 ngram 解析器的 FULLTEXT 索引忽略:innodb_ft_min_token_sizeinnodb_ft_max_token_sizeft_min_word_lenft_max_word_len

建立使用 ngram 解析器的 FULLTEXT 索引

若要建立使用 ngram 解析器的 FULLTEXT 索引,請在使用 CREATE TABLEALTER TABLECREATE INDEX 時,指定 WITH PARSER ngram

以下範例示範如何建立帶有 ngram FULLTEXT 索引的資料表、插入範例資料(簡體中文文字),並在 Information Schema 的 INNODB_FT_INDEX_CACHE 資料表中檢視 Token 化後的資料。

mysql> USE test;

mysql> CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT,
      FULLTEXT (title,body) WITH PARSER ngram
    ) ENGINE=InnoDB CHARACTER SET utf8mb4;

mysql> SET NAMES utf8mb4;

INSERT INTO articles (title,body) VALUES
    ('数据库管理','在本教程中我将向你展示如何管理数据库'),
    ('数据库应用开发','学习开发数据库应用程序');

mysql> SET GLOBAL innodb_ft_aux_table="test/articles";

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;

若要將 FULLTEXT 索引新增至現有資料表,您可以使用 ALTER TABLECREATE INDEX。例如:

CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT
     ) ENGINE=InnoDB CHARACTER SET utf8mb4;

ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;

# Or:

CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;

ngram 解析器空格處理

ngram 解析器在解析時會消除空格。例如:

  • ab cd會被解析為 abcd

  • a bc會被解析為 bc

ngram 解析器停用字處理

內建的 MySQL 全文解析器會將單字與停用字清單中的項目進行比較。如果單字與停用字清單中的項目相等,則該單字會從索引中排除。對於 ngram 解析器,停用字處理的方式不同。ngram 解析器不會排除與停用字清單中的項目相等的 Token,而是排除包含停用字的 Token。例如,假設 ngram_token_size=2,則包含 a,b 的文件會被解析為 a,,b。如果逗號 (,) 被定義為停用字,則 a,,b 都會從索引中排除,因為它們都包含逗號。

預設情況下,ngram 解析器使用預設停用字清單,其中包含英文停用字清單。若要使用適用於中文、日文或韓文的停用字清單,您必須建立自己的清單。有關建立停用字清單的資訊,請參閱章節 14.9.4,「全文停用字」

長度大於 ngram_token_size 的停用字會被忽略。

ngram 解析器詞彙搜尋

對於自然語言模式搜尋,搜尋詞彙會轉換為 ngram 詞彙的聯集。例如,字串 abc(假設 ngram_token_size=2)會轉換為 ab bc。假設有兩個文件,一個包含 ab,另一個包含 abc,搜尋詞彙 ab bc 會比對到這兩個文件。

對於布林模式搜尋,搜尋詞彙會轉換為 ngram 片語搜尋。例如,字串「abc」(假設 ngram_token_size=2)會轉換為 '「ab bc'。假設有兩個文件,一個包含 'ab',另一個包含 'abc',搜尋片語 '「ab bc' 只會比對到包含 'abc' 的文件。

ngram 解析器萬用字元搜尋

由於 ngram FULLTEXT 索引僅包含 ngram,而不包含有關詞彙開頭的資訊,因此萬用字元搜尋可能會傳回非預期的結果。下列行為適用於使用 ngram FULLTEXT 搜尋索引的萬用字元搜尋

  • 如果萬用字元搜尋的前綴詞彙短於 ngram Token 大小,則查詢會傳回所有包含以該前綴詞彙開頭的 ngram Token 的索引列。例如,假設 ngram_token_size=2,則對 a* 進行搜尋會傳回所有以 a 開頭的列。

  • 如果萬用字元搜尋的前綴詞彙長於 ngram Token 大小,則前綴詞彙會轉換為 ngram 片語,並且忽略萬用字元運算子。例如,假設 ngram_token_size=2,則 abc* 萬用字元搜尋會轉換為 ab bc

ngram 解析器片語搜尋

片語搜尋會轉換為 ngram 片語搜尋。例如,搜尋片語 abc 會轉換為 ab bc,這會傳回包含 abcab bc 的文件。

搜尋片語 abc def 會轉換為 ab bc de ef,這會傳回包含 abc defab bc de ef 的文件。不會傳回包含 abcdef 的文件。