RoRでCGMサイト構築虎の巻

第6回 ユーザーの満足度を向上させるプラグイン活用

小椋 隆史
株式会社Cuon

2009/9/9

 柔軟な全文検索の実現:Apache Solr

 次に、今後導入を検討しているサービスとして、全文検索エンジンのApache SolrとOpenIDについて簡単に紹介する。Railsとは直接的には関連はないが、プラグインを導入することで、Railsで構築したWebサービスにこういったものが取り入れられるのではないかという方向で考えている。

 第5回「“最適な”全文検索システムの選択」で紹介したSennaを利用した検索システムは、Ludiaを採用したことにより検索用にPostgreSQL、通常運用にMySQLという管理の仕方になってしまった。

 本来、RDBMSに組み込む形の検索エンジンの利点の1つは、データの一元管理ができるということにある。このメリットを得られないのであれば構成の刷新を検討すべきではないか。

 そういった観点で別の全文検索ソリューションを検討した結果、Apache Solr(以下Solr)という選択肢が出てきた。SolrはApache Lucene(以下Lucene)という全文検索エンジンのインターフェイスを提供するサーバ型アプリケーションである。

 LuceneはApacheプロジェクトで開発されているフリーの全文検索ライブラリである。Google File System/MapReduceクローンのHadoopの作者としても知られるDoug Cutting氏により開発された。余談ではあるが、Hadoopの開発のきっかけはLuceneのインデクシング速度向上のためだという。

 海外での導入事例はオープンソースのライブラリとしては非常に多く、中でもCNETにおいてLuceneをベースとして開発されたSolrは、JSONやXML、各言語のHashなどといった各種インターフェイスを提供している。フロントエンドシステムのプログラミング言語の制約を考えずにサービスを組み合わせられることから、多くのシステムに採用されている。

 SolrもはLuceneのサブプロジェクトとして開発が進んでおり、こちらはCNETのYonik Seeley氏が開発をリードしている。Solrのコミッタにはロンウイットの関口宏司氏も名を連ねており、リクルートの「おしえるまなべる」「Goodリフォーム.jp」などを皮切りに国内での事例も増えてきている状況だ。

 Sennaと比べたLucene/Solrの検索機能としてのメリットの1つは、ファセットカウントの管理が容易なところである。ファセットカウントとは、絞り込み用のナビゲーションリンクに絞り込み結果が何件になるかを表示する数値情報のことである。

 ナビゲーション用のカテゴリーを作成し、検索対象情報にカテゴリー情報を設定することにより、検索画面においてそのカテゴリーに属するアイテムがいくつあるかを示すことができる。ユーザーはそのリンクを辿ることによって検索ワードを入力することなく絞り込みが可能になる。

 Solrの利用に際しては、Solrサーバにリクエストを出した結果を利用することになるため、内部的にAPIを叩くのとさほど変わらない実行コストで導入ができるだろう。

 具体的な準備としては、Solr本体にあるRubyクライアントであるsolr-rubyの導入が必要になる。ここから、solr-rubyを利用したアクセス処理を別途書くか、よりRailsに近づけるためにプラグインの導入を行うという2つのアプローチがある。ここでは、後者のアプローチを想定して、acts_as_solrとFlareというプラグインを紹介する。

 acts_as_solrとFlare

 acts_as_solrは名前から推測できるように、ActiveRecordのModelにSolrに関する振る舞いを追加するプラグインである。ModelをsaveしたときにSolrにインデックスを追加できる。また、find_by_solrというメソッドの追加によって検索処理をSolrに委ねることが可能だ。

 findメソッドとしてそのままSolrサーチを使えるのは便利なのだが、デメリットになるところもある。acts_as_solrメソッドの中でSolrサーバへの接続を確認し、接続ができなかった場合に例外が発生する仕様だ。

 この仕様によって、単純に該当Modelの表示をするようなリスト画面があったときにSolrサーバが起動していない状態だと、このリスト画面の表示もできないということになる。

 サービスが2つのサーバにまたがっている以上、両方立ち上がっていてしかるべきではあるが、影響は大きいだろう。最悪検索できなくてもコンテンツ表示は継続するという方針であれば、現状ではプラグインに手を入れる必要がある。サービスとしてどのように運用していくかの計画時点で検討することになるだろう。

 Flareは、ファセットカウントやAjaxサジェスチョンを盛り込んだ検索画面をRailsのController経由で提供するプラグインである。Controller自体はほぼパススルーとしてしか使わずにいるので、routes上で制御できる別アプリケーションと考えるといいだろう。

 この場合は上述における検索サービスとそれ以外のサービスの分離ができている。検索ロジック周りについての変更についてはFlareの中を追いかけていく必要があるが、View部分に関してはRailsの流儀で書けるので比較的楽に試せるだろう。

 ユーザー流入への「お試しサービス」の布石:OpenID

 この記事をご覧の読者であればOpenIDが何かをご存じだと思うが、あえて一言でいうと、認知度のある、すなわちある一定の信用力を持ったWebサイトの認証情報を使ってログインする技術といったところだろうか。

 見たことのないWebサイトにいきなり会員登録を要求されるよりは、既存の有名サイトのログイン情報を使って、サイト機能を試用もしくは完全利用してもらうことができるという仕組みを導入した方が、新規流入者に対して会員登録への抵抗感が下がるものと期待される。

 このことから、OpenIDの導入により「お試し利用」から本格利用へというWebサービスの誘導方法が確立できるのではないかと模索している段階である。Webサイトのお試し利用というところで、内部で情報を持たずに利用できるサービスとできないサービスの垣根を意識していくことが今後のサイト構築に必要になってくるだろう。

 Railsでの利用では、OpenID Authenticationプラグインを使うことになるだろう。さらにRP(Relying Party)を作成する際には、これに諸橋恭介氏作成のrepimプラグインを導入すると便利だろう。

 Rails本体を含め、さまざまなプラグインはgithubに登録されていることが多い。われわれも探して使ってみるだけでなく、今後は社内で作成した仕組みをプラグイン化して公開できるものを作りたいと思っている。

 今回はプラグイン利用に対しての自分たちなりの対処や、取り組む予定のサービスと、それに関連したプラグインの紹介をした。Railsのレールからはずれることなく、適宜外部サービスとの連携をすることによってサイト全体のサービスの質を向上させていくことは展開方法として非常に有効になると考えている。

 今回で、「RoRでCGMサイト構築虎の巻」は最終回となるが、今後も新しい技術を導入しつつ運用していきたいと思う。また、今回培った技術を基に新しいサイトの構築も進めていきたい。

prev
2/2

Index
ユーザーの満足度を向上させるプラグイン活用
  Page1
jpmobileでモバイルサイト構築
 Page2
柔軟な全文検索の実現:Apache Solr
acts_as_solrとFlare
ユーザー流入への「お試しサービス」の布石:OpenID

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

本日 月間