検索機能を実装する

金儲けを考える人たちの自由な発想に応えるのが我々雇われエンジニアの定め。とはいえもうちょっと現実的な要求になりませんか、その発想は自由すぎやしませんか、人がいくらいたって作れませんよそんなもの。
とまぁ、よくある話で、どんなデータも思いのままに検索可能な魔法を要求されたので、まずは調べ物から。
GoogleやらYahoo!のおかげで「検索」という言葉のイメージがだいぶ変わったように思うけど、検索と一言で言っても技術的には様々ある。

  • grep みたいな作るのは簡単、使うのは重いツールも検索といえば検索
  • DBにデータをつっこんで SELECT するのも検索
  • 全文検索エンジンを使って検索するのももちろん検索

一番魔法に近いのは全文検索なんだけど、全文検索と言っても実装は一つじゃない。イロイロ。
検索対象のデータをどう分解して保存するかが日本語検索の鍵になるわけだけど、その方法は大きく分けて2種類

形態素解析による分かち書きの結果は辞書次第とはいえ、わりとキレイな情報が得られる。
N-gram法による分解は語句の内容を問わない点で有利だけど、その分結果のノイズが大きい。「かきくけこ」をN-gramで調べると「かき」「きく」「くけ」などもヒット。
さらに、インデックス化したデータをどうやって保存するかも大きめの規模の検索には重要で、スケーリングを考えずに小規模に済ますならファイルで十分だし、大規模化を考えたいなら検索インデックスのストレージ部にはDBを選ぶかもしれない。
http://qwik.jp/senna/FrontPageJ.html
これ一番注目。俺は会社員なので、仕事として選ぶならちゃんとした会社がサポートについている点が魅力。MySQLに組み込んで使うhttp://qwik.jp/tritonn/これもイイ。

http://googlejapan.blogspot.com/2007/11/n-gram.html
金がかかるということよりは、データそのものが学術利用に限定されているので、実用性という面からは使えないデータなわけだけど、その試みがすごく良い。面白い。

http://www.tatamilab.jp/rnd/archives/000390.html
MySQL全文検索チュートリアルとして読むのにすごく良い。

http://hyperestraier.sourceforge.net/index.ja.html
N-gramによる実装。mewでメールの検索に使ってるけど速くて良いよ。いろんなプログラミング言語用のインタフェースを備えてる点もポイント高いね。ストレージ部のDBまで独自実装でハイレベルだけど、このDBはDBM的なもので複数サーバで云々という拡張はできなさそう。中規模検索に最適か。

検索用のインデックスをMySQLに持つ実装が一番その後のスケールアウトが楽に思える。分かち書きN-gramか、どっちが良いかはデータと検索仕様によるし、有力候補はSennaかな。

http://www.scs.co.jp/mysql/
このページの下のほうにあるプレゼン資料が秀逸。わかりやすーい。