mozyのかきおき

mozyの読書感想文や思考置き場

MySQL5.7 以降なら ElasticSearch 使わなくても いい感じに日本語全文検索できるよって話

経緯

とあるシステムでフォームに入力された文字を元に駅名テーブルから駅名を推薦したいという需要があった。そこで日本語の全文一致検索について調べた時のメモ

概要

もともと、MySQLには、LIKE検索というものがあって、文字を比較して検索をかけることができた。しかし、精度が低いしなんといっても遅い。
そこで、色々調べていたところ、MySQL5.7 以降ならinnodbの日本語全文検索がいい感じに使えるらしい。
そのため試しに使ってみた結果、速いし精度高いし、手軽だし幸せになれた。

やっていく

具体的には FULLTEXT KEY(title) WITH PARSER NGRAM みたいな感じにして検索するだけ。

以下の参考サイトの解説が最強なので読むべし。

原理の説明

MySQLのフルテキストインデックスを利用した全文検索は、以下のような原理で動きます。

INSERT/UPDATE時は対象カラムの内容をトークナイズしフルテキストインデックスに格納 全文検索時はフルテキストインデックス内から検索文字列をトークナイズし完全一致で検索 だが、MySQL5.6以前では日本語のトークナイズが空白文字やカンマなどでの区分けのみの状態でした。 つまり、日本語の場合は文字列ほぼそのまんまでインデックスに格納されてしまっていたのです。 そのインデックスに対して完全一致でしか検索しないので、文章の一部を含む文字列で全文検索をかけても、完全一致しないからヒットしないという状況でした。

MySQL5.7ではここが変わり、ngram(n文字で区分け)やmecab(辞書を利用する)によるトークナイズが利用可能になり、使い物になるレベルでの日本語全文検索が利用可能になったのです!

参考サイトより引用

参考サイト

LIKE検索より50倍速い!?MySQLでラクラク高速な日本語全文検索 - bitA Tech Blog