RoRでCGMサイト構築虎の巻

第5回 “最適な”全文検索システムの選択

水谷 裕生
株式会社Cuon

2009/3/27

LifePaletteの全文検索アーキテクチャ

 もう一度、構成技術要素について簡単に紹介しよう。LudiaはNTTデータが開発した、PostgreSQLに全文検索機能を追加するためのオープンソースのソフトウェアである。

 NTTデータが公開した資料によれば、PostgreSQL内に、テーブル内テキストデータに対する全文検索インデックスを作成することで、商用のデータベース管理ソフトに匹敵する高速・高精度な全文検索機能を可能にしている。

 また、SQLと親和性が高く、扱いやすいインターフェイスが特徴である。インデックス作成にはオープンソース全文検索エンジンSennaを利用し、N-gramと形態素解析のインデックス主要2方式に対応している。

 さらに、検索方法もブーリアン検索、近傍位置検索、類似文書検索の複数の検索に対応している。検索結果の合致度を示すスコア取得機能も備えている。

 一方、acts_as_ludiaは、Ruby on RailsからLudiaを利用しやすくするためのプラグインである。Ludiaを直接操作する場合、データベースへのクエリが複雑になりがちなのだが、それをRailsらしい「直観的な操作」を可能にしてくれる。

 これらの技術要素の関係を右図にまとめる。

 さて、われわれがLifePaletteで全文検索を実現するために構成したアーキテクチャは以下のとおりである。

 ユーザーのリクエストをアプリケーションサーバ内のmongrelが受け取り、それをRuby on Railsで処理する。その際に、全文検索以外の処理はMySQLで処理し、全文検索の処理はPostgreSQLを用いる。

 ユーザーから投稿されたデータはMySQLに蓄積され、セカンダリDBサーバのMySQLへレプリケーションされる。定期的に走らせるバッチ処理でセカンダリDBサーバのMySQLから、PostgreSQLへ全文検索の対象となるデータを投入する。

 今後データが増えていくにつれバッチ処理が重くなることが予測されるので、直接プライマリDBサーバを参照するのではなくセカンダリDBサーバを参照する仕組みにした。バックアップも、ユーザーへのリクエストに影響しないよう直接プライマリDBを参照しないような仕組みにしている。

 当時の“最適な選択”を振り返って

 LifePaletteも公開サービスインから1年が経過しようとしている。その当時では最適な選択だったとしても、いまとなってはそれがよかったのかどうか、疑問な部分も多い。

 Ruby on Rails自体も速いペースでバージョンアップが繰り返される中、プラグインの対応がその速さに追随できずに陳腐化してしまっている状況もある。今回紹介したacts_as_ludiaも残念ながら最新のRailsには対応できていない。現在、当時と同じ選定をすると、Ludiaを選択していたかどうかは疑問である。

 また、実際に運用してみて、運用の負荷が高かった部分もあった。異なるデータベースシステムを運用するのはかなり運用コストが高い。

 実際の運用ではそれぞれのシステムで深い知識が要求されてしまう。思ったような検索精度を出すにはチューニングも必要になるし、一度トラブルが発生すればそれぞれのリカバリのノウハウが必要になってくる。

 いま思えば、MySQL 5.0で統一するべきだったとか、PostgreSQLに統一すればよかったかなとも思ってしまう。しかし、それはそれで別の問題があった可能性も高い。この移り変わりの速いネットの世界では正解は存在しないのだ。

 その時々のベストであろう選択をし、トライ&エラーを繰り返しながら改善を施していくしかないのだろう。これといった正解がないからこそ、オープンソースでの開発は面白いのだ。

 次回は、LifePaletteを実際に運用したうえで直面した問題への改善方法や、拡張性を図るための施策など、今後取り組む予定の技術について紹介しようと思う。今回紹介した全文検索の代替として予定しているLuceneSolrや、データベースの負荷分散など、どのような取り組みを予定しているかについて語る。

関連リンク:
リンク Lucene
http://lucene.apache.org/
リンク Solr
http://lucene.apache.org/solr/

2/2
 

Index
“最適な”全文検索システムの選択
  Page1
アーキテクチャの選択は非常に難しい
全文検索エンジンの選定
選定ポイントの重み付け
Page2
LifePaletteの全文検索アーキテクチャ
当時の“最適な選択”を振り返って
RoRでCGMサイト構築虎の巻

 Ruby/Rails関連記事
プログラミングは人生だ
まつもと ゆきひろのコーディング天国
 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる
生産性を向上させるRuby向け統合開発環境カタログ
Ruby on Rails 2.0も強力サポート
 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる
かんたんAjax開発をするためのRailsの基礎知識
Ruby on RailsのRJSでかんたんAjax開発(前編)
 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう
Praggerとnetpbmで作る画像→AA変換ツール
Rubyを使って何か面白いものを作ってみよう!
 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう
コードリーディングを始めよう
Railsコードリーディング〜scaffoldのその先へ〜(1)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間