MySQL5.7でのトークナイズ

2020年11月9日月曜日

MySQL トークナイズ

t f B! P L
3年前ぐらいのメモが出てきたので、備忘録として残しておく。

# 内容

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('"グレ レー ープ プフ フル ルー ーツ"');

注目の投稿

composer.lockはGit管理すべき話

# 背景 # 結論 # composer installとcomposer updateの違い # 背景 仕事では主にLaravelを使用して開発を行っている。 ソースコードはGitでバージョン管理を行い、compose...

プロフィール

7年ほど中小企業でSIerとして働いていました。 現在は個人事業主としてPHP, Javascriptの企業案件をメインに受けています。 最近はポケモンカードの開封にはまっています。

アーカイブ

このブログを検索

QooQ