柔軟な全文検索の実現: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サイト構築虎の巻」は最終回となるが、今後も新しい技術を導入しつつ運用していきたいと思う。また、今回培った技術を基に新しいサイトの構築も進めていきたい。
2/2 |
Index | |
ユーザーの満足度を向上させるプラグイン活用 | |
Page1 jpmobileでモバイルサイト構築 |
|
Page2 柔軟な全文検索の実現:Apache Solr acts_as_solrとFlare ユーザー流入への「お試しサービス」の布石:OpenID |
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を紹介する。※ショートカットキー、アクセスキーの解説あり
|
|