MySQL 8.0 リファレンスマニュアル


12.10.8 ngram 全文パーサー

組込みの MySQL 全文パーサーは、単語間の空白をデリミタとして使用して、単語の開始位置と終了位置を決定します。これは、単語デリミタを使用しない表意文字言語を使用する場合の制限です。 この制限に対処するために、MySQL には、中国語、日本語および韓国語 (CJK) をサポートする ngram 全文パーサーが用意されています。 ngram 全文パーサーは、InnoDB および MyISAM での使用がサポートされています。

注記

MySQL には、ドキュメントを意味のある単語にトークン化する日本語用の MeCab 全文パーサープラグインも用意されています。 詳細は、セクション12.10.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 全文パーサーは、組み込みのサーバープラグインです。 ほかの組み込みサーバープラグインと同様に、サーバーの起動時に自動的にロードされます。

セクション12.10「全文検索関数」 で説明されている全文検索構文は、ngram パーサープラグインに適用されます。 このセクションでは、解析動作の違いについて説明します。 単語の最小長および最大長オプション (innodb_ft_min_token_size, innodb_ft_max_token_size, ft_min_word_len, ft_max_word_len) を除く、全文関連の構成オプションも適用できます。

ngram トークンサイズの構成

ngram パーサーのデフォルトの ngram トークンサイズは 2 (bigram) です。 たとえば、トークンサイズが 2 の場合、ngram パーサーは文字列 abc def を 4 つのトークンに解析: abbcde および ef

ngram トークンサイズは、最小値が 1 で最大値が 10 の ngram_token_size 構成オプションを使用して構成できます。

通常、ngram_token_size は、検索する最大トークンのサイズに設定されます。 単一文字のみを検索する場合は、ngram_token_size を 1 に設定します。 トークンサイズを小さくすると、全文検索インデックスが小さくなり、検索が高速になります。 複数の文字で構成される単語を検索する必要がある場合は、それに応じて ngram_token_size を設定します。 たとえば、Happy Birthday は簡体字中国語の生日快乐で、生日「誕生日」で、快乐「幸せ」として翻訳されます。 これらのような 2 文字の単語を検索するには、ngram_token_size を 2 以上の値に設定します。

読取り専用変数として、ngram_token_size は起動文字列の一部または構成ファイルでのみ設定できます:

  • 起動文字列:

    mysqld --ngram_token_size=2
  • 構成ファイル:

    [mysqld]
    ngram_token_size=2
注記

ngram パーサーを使用する FULLTEXT インデックスでは、次の最小および最大ワード長構成オプションは無視されます: innodb_ft_min_token_size, innodb_ft_max_token_size, ft_min_word_len および ft_max_word_len

ngram パーサーを使用する FULLTEXT インデックスの作成

ngram パーサーを使用する FULLTEXT インデックスを作成するには、CREATE TABLEALTER TABLE または CREATE INDEX とともに WITH PARSER ngram を指定します。

次の例では、ngram FULLTEXT インデックスを使用したテーブルの作成、サンプルデータの挿入 (簡体字中国語テキスト)、および INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE テーブルでのトークン化されたデータの表示を示します。

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 TABLE または CREATE INDEX を使用できます。 例:

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

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 cdabcd に解析されます

  • a bcbc に解析されます

ngram パーサーのストップワード処理

組込みの MySQL 全文パーサーは、ワードをストップワードリストのエントリと比較します。 ワードがストップワードリストのエントリと等しい場合、そのワードはインデックスから除外されます。 ngram パーサーの場合、ストップワード処理は異なる方法で実行されます。 ngram パーサーは、ストップワードリストのエントリと等しいトークンを除外するかわりに、次を含むがストップワードするトークンを除外します。 たとえば、ngram_token_size=2 の場合、a,b を含むドキュメントは a,および,b に解析されます。 カンマ (,) がストップワードとして定義されている場合、a,,b の両方にカンマが含まれているため、インデックスから除外されます。

デフォルトでは、ngram パーサーは、英語のストップワードのリストを含むデフォルトのストップワードリストを使用します。 中国語、日本語または韓国語に適用可能なストップワードリストの場合は、独自のものを作成する必要があります。 ストップワードリストの作成の詳細は、セクション12.10.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 インデックスには ngrams のみが含まれ、用語の先頭に関する情報は含まれないため、ワイルドカード検索で予期しない結果が返されることがあります。 ngram FULLTEXT 検索インデックスを使用したワイルドカード検索には、次の動作が適用されます:

  • ワイルドカード検索の接頭辞語句が ngram トークンサイズより短い場合、クエリーは接頭辞 term で始まる ngram トークンを含むすべてのインデックス付き行を返します。 たとえば、ngram_token_size=2 の場合、a* で検索すると、a で始まるすべての行が返されます。

  • ワイルドカード検索の接頭辞用語が ngram トークンサイズより長い場合、接頭辞用語は ngram 句に変換され、ワイルドカード演算子は無視されます。 たとえば、ngram_token_size=2 の場合、abc* ワイルドカード検索は ab bc に変換されます。

ngram パーサーフレーズ検索

フレーズ検索は ngram 句検索に変換されます。 たとえば、abc という検索フレーズは、abc および ab bc を含むドキュメントを返す ab bc に変換されます。

abc def という検索フレーズは、abc def および ab bc de ef を含むドキュメントを返す ab bc de ef に変換されます。 abcdef を含むドキュメントは返されません。


関連キーワード:  関数, ngram, 検索, パーサー, token, size, 全文, インデックス, abc, 空間