Ngramを使ったお手軽爆速FTS

DBからお望みの文字列を含む項目を検索するとなればlikeを使う、と相場が決まっていると思っていた。他に技を知らなかったし、検索が遅いのも当然のことと諦めていた。実際のところ250万件のテストデータを入れてみると、検索に30分もかかる。でも、当たり前じゃんと思っていた。
しかし、ググって調べたところ、Ngramなる技法を使って日本語のフルテキストサーチが速くなる、というようなページを見つけた。実際のところ、フルテキストサーチでは「単語」を辞書(DBではインデックス)に登録することが出来るから、高速検索ができる。しかし、日本語の場合(英語と違って)単語の区切りが分からない。(ブランクとかないからね。)まともにやろうと思ったら、形態素解析などの日本語処理が必要となって、そろそろただごとではなくなる。そこで登場するのがNgram。何でもシャノンが考案したものとのこと。本来の目的は検索ではないらしいが、そうなのか、やっぱり天才って天才だわ。日本語の文法的な解析は何もせず、機械的にN字ずつに分けて単語として登録してしまう。ただ分けると分け目にかかってしまった単語を検索できなくなるので、分け目をオーバーラップさせながら、登録するところがミソ、かつ、検索語もそのようにN字ずつ分けてしまい、そのすべての分割検索語が現れれば、検索成功ということにしちゃう。これで、少なくとも日本語の検索においては、驚くほど高速に「ほぼ完全な」検索ができる。もちろん、本来引っかからなくても良いものが引っかかってしまうことはあるが、逆(引っかかるべきものを取りこぼすこと)は絶対にない。お蔭様で、例えば50万件くらいの検索だと、今まで2分以上はかかっていたと思うのだが、ものの数秒で結果が得られる。シャノンすごい。あと、そういうページを書いてくれていた人たちにも感謝。