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を実際に運用したうえで直面した問題への改善方法や、拡張性を図るための施策など、今後取り組む予定の技術について紹介しようと思う。今回紹介した全文検索の代替として予定しているLucene+Solrや、データベースの負荷分散など、どのような取り組みを予定しているかについて語る。
関連リンク: | |
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) 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ |
|
- プログラムの実行はどのようにして行われるのか、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を紹介する。※ショートカットキー、アクセスキーの解説あり
|
|