モノノフ日記

普通の日記です

「全文検索エンジンgroongaを囲む夕べ 2」に参加してきました

全文検索エンジンgroongaを囲む夕べ 2 #groonga : ATNDに参加してきました。
全文検索エンジンとしてgroongaを業務に導入しようとしているので情報を求めて参加したんですがいろいろと参考になる情報がたくさん聞けました。会場はVOYAGE GROUPさんのオフィスだったんですがやたらカッコよかったです。

Ustreamのアーカイブも公開されていますので参加できなかった人も安心ですね。
groongaを語る夕べ #2 November 29, 2011 12:18 PM, groongaを語る夕べ #2 November 29, 2011 12:18 PM gunyarakun on USTREAM. Lifecasting

勉強会の内容はgroongaの開発者の方々が過去、現状、将来について熱く語る、というものでした。
勉強会レポートは全文検索エンジンgroongaを囲む夕べ2 #groonga - nokunoの日記がすごくまとまってます。メモ凄すぎ。
以下、自分のメモから発表タイトルごとにざっと感想をまとめていきます

groonga村

株式会社クリアコードの須藤(すとう)さんの発表でした。

発表資料は下記で公開されているので詳細はご確認ください。
http://www.clear-code.com/archives/groonga-night-2-introduction/groonga-village.pdf

groonga自体はライブラリ(libgroonga)であり、他のソフトウェアからgroongaを使う実装の状況についての解説がメインでした。libgroongaの構成とソフトウェアがどうやってgroongaにアクセスしてるのかが図になってて理解しやすかったです。

村の住人は現在のところ5人のようです。

  • groonga(村長)
  • rroonga (ruby)
  • mroonga (MySQL)
  • nroonga (node.js)
  • textsearch_groonga (PostgreSQL)

「libgroongaがhttpプロトコル喋れるのに、なんでnode.js対応のnnrooga(ぬるんが)を何故作ってるんですか?」という質問がありました。
回答は「自前のイベント実装がイマイチ、websocketとの相性が良さそうだから」とのことでした。確かにwebsocketとは相性良さそう。将来httpプロトコルを介したgroongaとの通信はnode.js経由が標準になるかもしれないですね。

あとgroongaが実際に採用されているサイトとして下記が挙げられてました。導入していて掲載OKな会社募集中だそうです。

groongaの開発者も募集されていました。開発するほど時間取れなさそうですが、暇を見つけてちまちまとコードは読んでみたいです。

新年と収穫の祭り

有限会社未来検索ブラジルの森大二郎さんの発表でした。個人的に今回一番面白かったです。
groongaの前身となるSennaの開発経緯から始まり現在に至るまでの過程、groongaで将来やってみたいことについての発表でした。
発表資料は下記で公開されています。
http://groonga.org/ja/publication/presentation/groonga-night-2-newyear-harvest.pdf

索引の動的構築にとにかくこだわってきたが、静的構築にも対応させているそうです。
静的構築ができるようになるとオフラインでの構築が有利になるのは当然ですが、他にもmroongaでalter tableができるようになったり、Sedueのプラグインになったりとメリットも多いとのことでした。

groongaに将来実装していきたい機能として語られていた索引の圧縮方式を参照頻度に応じて圧縮率を変えてデータ量を効率化させる、とかデータ分布に応じてカラム構造をgroongaが最適化してくれるスキーマレス機能、などはどうやって実現するんだろうと興味津々でした。

mroonga

mroonga(むるんが)はgroongaをMySQLから利用できるソフトウェアです。いわゆるtritonnの後継ですね。SpiderやVPの作者の斯波さんの発表でした。
発表資料はslideshareで公開されています。
http://www.slideshare.net/Kentoku/introducing-mroonga-20111129

まずmroongaの読み方が「むるんが」であることを初めて知りました。バージョン1.10からパッケージ名もmroongaになっていたのでこれから「むるんが」って言う人が増えていくんでしょうか。

発表内容はこの1年間でのmroongaに実装された機能を中心に紹介していき、今後もいろいろ実装しますよ、という話でした。ラッパーモードなどは面白いアイデアですよね。個人的にはレプリカ作って並べれば検索エンジンとしては十分な気がしています。ただInnoDBじゃないとトランザクションが、、、みたいな話はよくありそうなのでユーザニーズにマッチしてると思います。

懇親会に出られなかったので2点ほど質問したかったことを備忘録としてメモっておきます。
1点目はタンデム構成(ex. mroonga + libgroongaのhttpプロトコル)の場合、マルチカラムインデックスで利用しているカラムを更新するとインデックスの整合性がとれなくなってしまう、と説明されていたところです。回避方法としてはタンデム構成のいずれかのマルチカラムを対象にした検索を諦めるしかないのか、という点です。対象カラムに対する更新が発生することがわかっている場合はmroongaのはカラム単位でFULLTEXTで貼っておけば、libgroongaではmatch_columnsでマルチカラム検索できると思います。ただmroonga側はできなくなっちゃいます。
2点目は全文検索用パーサーカスタマイズができるんですがカラム単位で異なるパーサー指定はOKなのか?という点です。
ここまで書いてて思ったけど自分で試せばよい気がしてきました。

最後に話されてましたがMariaDBへのバンドルが決まったそうです。これかなり凄いことだと思います。MariaDBにのってるストレージエンジンってAria、XtraDB、PBXTなどサードパーティの有名どころが大抵入ってます。これらにgroongaが追加されるってことになります。

Geographical Searching

(追記)発表資料がアップされていました。
http://groonga.org/ja/publication/presentation/groonga-night-2-geographical-searching.pdf

ぐるなびの塩畑さんの発表でした。groongaを導入した経緯から現在の運用状況までをシンプルにまとめて話しされていました。ぐるなびは位置情報検索も重視しているようでgroongaというよりはgeoSearch寄りの話がメインでした。
距離計算のロジックとgroongaに組み込まれてるgeo系の関数の話をセットで話しされてたんですが、geo_distance(方形近似)は知ってたんですが、geo_distance2(球面近似)、geo_distance3(ヒュベニの距離計算式)の2つの関数は知りませんでした。マニュアル読み直してみるとこっそり書いてありました。

geo_distance() 関数は、point1に指定した座標とpoint2に指定した座標の間の距離(近似値)を求めます。 geo_distance()の他に、距離計算アルゴリズムの異なる、geo_distance2()、geo_distance3()が使用できます。それぞれ、長方形近似、球面近似、ヒュベニの距離計算式によって距離を算出します。

ぐるなびのレストラン54万件に対する位置情報検索のベンチマークにも触れられていて、groonga(チューニング済み)を導入して90%の速度向上(0.34s → 0.03s)を実現したそうです。

groonga with PostgreSQL

フォルシアの奥野さんの発表でした。正直PostgreSQLは触ったことないのであんまりわからず。。鋭意対応させてます!というのとPostgreSQL9.1から実装されたFDWを使ってgroongaを利用するライブラリを作成していて年内にはアルファ版をリリースしたい、と宣言されていました。
現状公開されているライブラリの名前がtextsearch_groongaという名前だったんですが、他ライブラリと合わせてproonga(ぷるんが)とかにして欲しいと思いました。

mroongaベンチマーク

再び須藤さんの発表でした。英語データをサンプルにしてMyISAMInnoDB FTS、mroonga、mroonga + innodbでの4つで全文検索ベンチマークを公開されていました。Wikipediaの英語版データとかを利用されたんでしょうか。比較した速度は全文検索、位置情報検索、更新性能の3つの観点からそれぞれグラフを作成されていました。全文検索はgroongaの圧勝、位置情報検索はMyISAMに若干及ばず、更新性能はgroongaの圧勝、という結果でした。位置情報検索はMyISAMは専用インデックスでやってるがgroongaは既存のインデックスを効率よく使って僅差という結果だそうです。ラッパーモードは更新性能自体はInnoDBのままなので即時反映させて検索、というのはやっぱり難しいようです。

mroongaの未サポート機能

再び斯波さんの発表でした。発表資料は以下になります。
http://www.slideshare.net/Kentoku/mroonga-unsupported-feature20111129
未サポート機能をリストアップされてそれぞれ解説されていました。気になったのは0跨ぎの緯度経度問題です。今携わってるフォートラベルというサイトは海外施設がいっぱいあったりするので。。。

groonga開発予報

未来検索ブラジルの矢田さんの発表でした。発表資料は以下にあります。
http://groonga.org/ja/publication/presentation/groonga-night-2-the-future.pdf
groonga 1.2.8で実装されているダブル配列の話を中心に3種類のインデックスタイプ(パトリシアトライ、ハッシュテーブル、ダブル配列)のメリット・デメリットの解説でした。ダブル配列は更新頻度は少ないが参照は多め、というサービスに向いてるんじゃないかということでした。将来像で言われていたハッシュテーブルの構築最適化は今よりパフォーマンス上がりそうなので期待しています。