今回は、前回登録した青空文庫のデータをもとにSolrのクライアントサイトを作っていきます。
クライアントサイトの構築にはPHPを使いたいと思います。
5.1 Solrクライアントの構成¶
作成するSolrクライアントの構成を図に示します。

クライアント構成
第一回目で少し書きましたが、Solrの検索にはHTTP GETを利用します。また、レスポンスはXML形式やJSON形式など様々な書式をサポートしています。
今回はWebアプリケーションとしてSolrクライアントを作成しましたが、HTTPが話せてXMLやJSONが処理できればネイティブアプリケーションとしてのSolrクライアントを作ることも可能です。
5.2 Solrのレスポンス¶
Solrの検索結果はデフォルトではXML形式(wt=パラメータで指定)で返ってきます。XML形式以外には以下の出力形式をサポートしています。
指定名 具体的なフォーマット json JSON形式 csv CSV形式 python eval可能なPython文字列 ruby eval可能なRuby文字列 php eval可能なPHP文字列 phps シリアライズ形式
これらの出力形式を自分で処理するのもよいですが、各種言語用のライブラリも充実しているので、それを使いたいと思います。
5.3 Solr エクステンション¶
クライアントライブラリには Solrエクステンションを使用しまた。これはPECLで提供されているのでインストールが楽そうだという理由で採用しました。
PECLがインストールされている環境であれば次のコマンドでインストールできます。
$ sudo pecl install solr
インストール後、/etc/php.ini に以下の設定を追加すればSolrエクステンションが使えるようになります。
extension=solr.so
なお、SolrエクステンションはSolrバージョン1.3、1.4と互換があるとのことですが、今回使用したApache Solr 4.2.1でも一応動作しました。
5.4 サイト画面¶
作成するサイトは図のようにしました。

サイト画面
基本的な検索機能のみでファセット検索、ハイライト等の機能は今回は実装していません。
文字列を入力し検索ボタンを押すと、検索結果として以下の項目を表示します。
- タイトル
- 著者名
- 出版社名
- 底本名
タイトルは青空文庫の図書カードへのリンクとなるようにしました。
5.5 プログラムとインストール手順¶
作成したサンプルプログラムがこちら に置いてあります。このファイルをダウンロードした後、以下の手順でインストールできます。
- サンプルプログラム(sample.201305.tgz) を展開し、ディレクトリを移動します。
- www/bootstrap.phpファイル内の SOLR_SERVER_* 定数の値を環境に合わせて変更します。
- 設定変更後、www/以下のファイルをドキュメントルート下に置きます。
5.6 実装メモ¶
Solrエクステンションを使うにあたって気になった点を挙げます。
検索フィールドの設定¶
Solrエクステンションを使って、検索を行うには大体以下のような手順になります。
$client = new SolrClient(array(サーバの設定等));
$query = new SolrQuery();
$query->setQuery("検索文字列");
$query->addField("レスポンスに含むフィールド名");
$query_response = $client->query($query);
/* $query_response に検索結果が入る */
検索クエリの設定を行うのにSolrQueryオブジェクトを使用します。それから、レスポンスに含むフィールドの設定にSolrQueryのaddFieldメソッドを呼ぶのですが、これがstring型しか受け付けてくれません。
複数のフィールドをセットする場合、配列にフィールド名を設定しておいてそれを繰り返し処理するなど、少し手間がかかるのが面倒だなと思いました。
$QUERY_FIELDS = array('id', 'title', 'family_name', 'first_name',
'publisher', 'orgbook', 'card_url');
foreach ($QUERY_FIELDS as $fl) {
$query->addField($fl);
}
queryメソッドの失敗¶
Solrサーバにクエリを投げるのにSolrClientオブジェクトのquery メソッドを使います。
これはドキュメントをちゃんと読めばわかるのですが、クエリに失敗した場合SolrClientException例外を投げるようになっています。(サンプルコードからエラー情報が入ったオブジェクトが返るものと思ってました...)
ということで、queryメソッドを使う場合はちゃんとSolrClientExceptionを捕捉してエラー処理を行うようにしましょう。
try {
$query_response = $client->query($query);
} catch (SolrClientException $e) {
/* エラー処理 */
}
以上です。
次回はこのサンプルプログラムにファセット検索、ハイライト機能などを追加してみたいと思います。