読者です 読者をやめる 読者になる 読者になる

Solrのクライアント側処理を考える

ApacheのSolrというプロジェクトをご存じでしょうか?
同じApacheLuceneという全文検索エンジンを使用した全文検索サーバーアプリケーションです。
このSolrはTomcat上でWebアプリケーションとして動作します。
単純な仕組みとしては・・・

  1. クライアント側でSolrサーバに投げる全文検索クエリ(Solr、Lucene互換)を生成する。
  2. 生成したクエリ文字列をSolrにHTTPでリクエストする。
  3. クエリを受け取ったSolrは、検索クエリを解析し全文インデックスファイルより条件に合致する文書を取得する。
  4. 取得した文書を任意の形式でクライアントにレスポンスする。以下の形式でレスポンスが可能。
    • 文字列
    • XML
    • JSON
    • SerializeしたJavaオブジェクト
  5. Solrから返された文書をクライアント側で加工する等して表示したりする。

Senという日本語形態素解析器と組み合わせれば、日本語文書であっても精度の高い全文検索が可能です。
ちなみにSolrはオープンソースながら、エンタープライズ向けに設計・実装されているため相当性能が高いです。(キャッシュ機構も充実している)
また、膨大な量の文書を捌けるように分散インデクシング機構も備えています(Lucene + Hadoopでも同じことができますが)。経験から言うと300万文書くらいなら1台で十分なパフォーマンスが出せます。

Solrを使った検索アプリケーションを構築するとなると、Solrサーバ側はインデックス構造を決めてXMLに定義するだけでいいです。ただ、クライアント側がは結構やらなくてはならないことが多い・・・。まず、データを投入するためのバッチが必要です。バッチではSolrに文書を登録するためのリクエスト(XML)を投げる処理が必要です。また、クライアントで検索結果を取得するためには検索クエリを生成したり、扱いやすいJavaオブジェクトにコンバートしたりとやる事が満載です。SolrjというクライアントからSolrの操作を簡単に行えるようにするAPIがあるんですが、まだ未成熟でパフォーマンス的に不満です。ということもあり、意外とクライアント側のオーバーヘッドが大きくなりがちなのです。

このようなことから、Solrのクライアント部分のパフォーマンス改善と検索処理・バッチ処理の実装には大きく改善の余地がある分野だと思ってます。この辺りを楽にかつ、ハイパフォーマンスにできるようなネタを考え中です。