RoRでCGMサイト構築虎の巻

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

水谷 裕生
株式会社Cuon

2009/3/27

Rubyを使った大規模エンタープライズ開発が始まっている。Ruby on Railsでの開発において、インフラやアプリケーションアーキテクチャをどのように構成すべきかを考える(編集部)

アーキテクチャの選択は非常に難しい

 システムを構築するうえで、アーキテクチャの選択は非常に難しい問題である。

 プラットホームはWindowsにするのか、Linuxにするのか。Linuxであれば、CentOSなのか、それともUbuntuなのか。また、開発言語はRubyがいいのか、PHPがいいのか。そして最後には、それらをどう組み合わせていくのかなどなど。

 どれが正解なのかは、実際に経験したり、運用したりしてみなくては分からないものだ。しかし、実際の現場では経験がなくても、いろいろと調査したり、実際に試したりしてみて判断をしなくてはいけない場面が存在する。

 今回は、患者さん・患者家族のためのコミュニティサイト「LifePalette(ライフパレット)」で使用している全文検索のアーキテクチャを例とし、その選択までのプロセスを紹介しよう。

 全文検索エンジンの選定

LifePalette LifePaletteは、闘病記を中心としたCGM(Consumer Generated Media)サイトである。今後、テキスト情報がどんどん蓄積されていくため、必要な情報を高い精度かつ、高速に探すための手段として全文検索の技術は非常に重要な機能であった。LIKE文での検索では文書量の増加に伴い、将来的に破綻することが容易に想像できたからである。

 そこで、何かしらの全文検索エンジンを選択し、採用する必要があった。全体の設計として、データベースにはMySQL 5.1を使用することが決定していた。CGMサイトのようなWebサービスの開発を行ううえでは、やはりMySQLの実績は捨て難いことと、クラスタリング化などを踏まえた将来的な拡張性の面から、バージョンを5.1に決めた。

 ただ、残念なことに当時、組み込み型の全文検索エンジンであるSennaがMySQL 5.1には対応していなかった。そこで、全文検索の部分だけを切り出して別途アーキテクチャを設計する必要があった。

 そこで候補として挙がったのが、MySQL+ToritonnとPostgreSQL+Ludiaだった。まず、MySQL5.0+Toritonnにするのか、PostgreSQL+Ludiaにするのか、そして、それらをどう組み合わせるのかを検討する必要があった。

関連リンク:
リンク Senna
http://qwik.jp/senna/FrontPageJ.html
リンク Toritonn
http://qwik.jp/tritonn/FrontPage.html
リンク Ludia
http://www.nttdata.co.jp/services/ludia/

 選定ポイントの重み付け

 全文検索エンジンの選択のポイントとして下記が挙げられる。

  1. パフォーマンス
  2. 扱いやすさ
  3. 検索の精度
  4. 運用のしやすさ

 この中で一番重要視したのが、パフォーマンスである。そこで、大量のテキストデータをデータベースに格納し、簡単なRuby on Railsのプログラムを作成して、JMeterによるパフォーマンスの計測を行った。

関連記事:
リンク JMeterによるWebサーバ性能評価の勘所
http://www.atmarkit.co.jp/flinux/rensai/apache2_02/apache02a.html

 全体的な結果としては、両者ともさほど変わらなかった。しかし、MySQLを使った組み合わせの方が10回に1回程度レスポンスが著しく劣るという現象が発生し、全体の平均値が低くなってしまった。

 もう少し調査をすれば、原因が分かったかもしれない。しかし、デフォルトでパフォーマンスを確保できることも重要な選択のポイントだった。

 次に重要視したのが扱いやすさだった。PostgreSQLには、acts_as_ludiaというRuby on Railsで簡単に利用できるプラグインがあった。一方、当時のMySQLにはプラグインがなく、findのconditionsオプションにクエリを直接記述する必要があった。従って、ここではPostgreSQLに軍配が上がる。

 検索の精度に関してはどちらも中身はSennaなので変わらないはずである。

 運用に関しては、弊社の開発案件の大半がメインのデータベースにMySQLを採用し、実績を挙げていることもあり、過去のノウハウの共有ができるためMySQLの方が有利である。決してPostgreSQLが運用しにくいという意味ではなく、このプロジェクトの枠組みの範囲においてである。

 結果を表にまとめた。最終的な判断は、PostgreSQL+Ludiaとなった。やはり、パフォーマンスを最重要視したからである。これで、エンジンの選定は終わった。次に、どのようにして構築していったかを解説していこう。

選定項目 パフォーマンス 扱いやすさ 検索の精度 運用のしやすさ
MySQL+Toritonn
PostgreSQL+Ludia

 
1/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 記事ランキング

本日 月間