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

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

🏗️ MySQLでngram全文検索を実現する手順(InnoDB + Ngram)
- テーブル作成時に 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によるトークナイズが使われる
- データを挿入
INSERT INTO articles (title) VALUES
('検索エンジンを作る'),
('全文検索は便利'),
('MySQLで高速検索');
-
MATCH ... AGAINST
で検索
SELECT * FROM articles WHERE MATCH(title) AGAINST('検索');
memo: ngram を使っている場合、検索語句も2文字以上にするのが推奨(設定による)。

🔧 ngramのデフォルト設定
- デフォルトは N = 2(2-gram)。
-
ngram_token_size
変数でサイズ変更可能(ただし、コンパイル時オプションなので動的変更不可)
SHOW VARIABLES LIKE 'ngram_token_size';
memo: ngram_token_size = 2 なら「検索エンジン」→「検」「索」「エ」...など

🚫 注意点
- MyISAM使用時は
WITH PARSER ngram
は使えない。InnoDBが必要。 - ngramは日本語・中国語向け。英語には不要な場合が多い。※単語境界がない言語向け
- ngramではストップワードリストは無視される。 ※通常の全文検索とは異なる

Reference:
このスクラップは4ヶ月前にクローズされました