Closed5

MySQLでngramを利用して全文検索を行う

tamaco489tamaco489

✅ N-gramとは?

  • N-gramは、文字列をN文字ずつの連続部分列に分割する手法。
  • 例: "検索エンジン" を 2-gram で分割 → ["検索", "索エ", "エン", "ンジ", "ジン"]
  • 形態素解析不要で、日本語などにも対応できる。
tamaco489tamaco489

🏗️ MySQLでngram全文検索を実現する手順(InnoDB + Ngram)

  1. テーブル作成時に FULLTEXT インデックス + ngram パーサーを指定
CREATE TABLE articles (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title TEXT,
  FULLTEXT(title) WITH PARSER ngram
) ENGINE=InnoDB;

memo:WITH PARSER ngram によって、ngramによるトークナイズが使われる

  1. データを挿入
INSERT INTO articles (title) VALUES
  ('検索エンジンを作る'),
  ('全文検索は便利'),
  ('MySQLで高速検索');
  1. MATCH ... AGAINST で検索
SELECT * FROM articles WHERE MATCH(title) AGAINST('検索');

memo: ngram を使っている場合、検索語句も2文字以上にするのが推奨(設定による)。

tamaco489tamaco489

🔧 ngramのデフォルト設定

  • デフォルトは N = 2(2-gram)。
  • ngram_token_size 変数でサイズ変更可能(ただし、コンパイル時オプションなので動的変更不可)
SHOW VARIABLES LIKE 'ngram_token_size';

memo: ngram_token_size = 2 なら「検索エンジン」→「検」「索」「エ」...など

tamaco489tamaco489

🚫 注意点

  • MyISAM使用時は WITH PARSER ngram は使えない。InnoDBが必要。
  • ngramは日本語・中国語向け。英語には不要な場合が多い。※単語境界がない言語向け
  • ngramではストップワードリストは無視される。 ※通常の全文検索とは異なる
このスクラップは4ヶ月前にクローズされました