# 内容
MySQL 5.6からInnoDBで全文検索(FullText Index)できるようになりました。
MySQL 5.6ではMeCabやN-gramに非対応なので、「空文字」や「,」で文字を区切ってあげる必要がありますが、
MySQL 5.7ではトークナイズが使えるようになりました。
InnoDBのFullText
Indexは「転置インデックス」なので検索文字数が多くなるにつれて遅くなります
# N-gram
N-gramは、任意の文字列や文章を連続したN個の文字で分割する手法です。
代表的なものに下記の3つがあります。
- ユニグラム - 1文字で分割する方法
- バイグラム - 2文字で分割する方法
- トライグラム ‐ 3文字で分割する方法
4文字、5文字で分割する方法もある。
分割数が増えるたびに検索精度は良くなるが、検索データ量が多くなり検索処理に時間がかかるようになる。
例えばバイグラムの形に変換された文章を「かき」で検索したとする。
下記のようなSQLとなり「かき」という単語がでてくるレコードの文章をインデックスで走査します。
select * from fruits where match(desctext) against('"かき"');
次にバイグラムの形に変換された文章を「グレープフルーツ」で検索したとする。
下記のようなSQLとなり「グレ」、「レー」、「ープ」、「プフ」、「フル」、「ルー」、「ーツ」という単語がでてくるレコードの文章をインデックスで走査します。
この場合だと7回インデックス走査が走ることになり、かきで検索するのに比べて時間がかかる結果となります。
select * from fruits where match(desctext) against('"グレ レー ープ プフ フル ルー ーツ"');