第5回 “最適な”全文検索システムの選択
水谷 裕生
株式会社Cuon
2009/3/27
Rubyを使った大規模エンタープライズ開発が始まっている。Ruby on Railsでの開発において、インフラやアプリケーションアーキテクチャをどのように構成すべきかを考える(編集部)
アーキテクチャの選択は非常に難しい
システムを構築するうえで、アーキテクチャの選択は非常に難しい問題である。
プラットホームはWindowsにするのか、Linuxにするのか。Linuxであれば、CentOSなのか、それともUbuntuなのか。また、開発言語はRubyがいいのか、PHPがいいのか。そして最後には、それらをどう組み合わせていくのかなどなど。
どれが正解なのかは、実際に経験したり、運用したりしてみなくては分からないものだ。しかし、実際の現場では経験がなくても、いろいろと調査したり、実際に試したりしてみて判断をしなくてはいけない場面が存在する。
今回は、患者さん・患者家族のためのコミュニティサイト「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/ |
選定ポイントの重み付け
全文検索エンジンの選択のポイントとして下記が挙げられる。
- パフォーマンス
- 扱いやすさ
- 検索の精度
- 運用のしやすさ
この中で一番重要視したのが、パフォーマンスである。そこで、大量のテキストデータをデータベースに格納し、簡単な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) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|