buzztter.comの舞台裏について
no title にて活用事例を募集されているようでしたので、Ludiaのお世話になっております http://buzztter.com/ の舞台裏について簡単に紹介させていただきます。
Ludiaはbuzztterの核心部であるstatusの解析に活躍しています。Ludiaでは、全文検索を含むSQLクエリを高速に処理できるため、
SELECT COUNT(user_id) FROM statuses WHERE text @@ 'キーワード' AND created_at >= '2007-06-26';
のように期間を限定して特定のキーワードを発言しているユーザ数を得ることができます(実際には言語を限定するなどもう少し複雑です)。これを多数のキーワードについて繰り返し行い、キーワードの重要度を決定しています。
また、類似発言抽出機能はそのままLudiaの類似文書検索を利用しています。対象ユーザの直近の発言をクエリに入れて検索することで機能を実現しており、とても短い時間で開発できました。
buzztterの解析で利用している検索は転置インデックスだけを用いて解決できる検索ではないので、statusが溜まってくると計算時間がかかるようになるという問題点があります。現状では古いstatusを別テーブルに手動で移動し、VACUUMをかけています。この作業にけっこうな時間がかかってしまいます。自動でこまめにstatusをアーカイブするなど、対策を検討する必要がありそうです。
そのほか、buzztterは以下のサブプログラムから構成されています。
- Backend DB: Postgresql + Ludia
- Web Frontend: Rails (Pound+mongrel_cluster)
- Fetcher: twitterから定期的にpublic_timelineを取得しメモリにプールする x 2
- Importer: (複数の)FetcherプロセスとRindaで通信しDBに格納する。Lingua::LanguageGuesser - 言語判定器を呼んで言語の判定も行う。
- Analyzer: DBに蓄積されたログを解析して、結果をDBに保存する
- Notifier: cronで起動されてtwitterにポストする
これらはCore Duo 2 E6400, Memory 2GBの自作PC上で動いています(Fetcherだけはstatus取りこぼしの防止のため別のマシンでも動かしています)。これだけでけっこう一杯一杯になっていて、他にも色々と機能を追加したいと思っていたのですがなかなか厳しいところです。