Apache Solr で全文検索

第5回 Solrクライアントサイトを構築する

2013.05.22

今回は、前回登録した青空文庫のデータをもとに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) {
  /* エラー処理 */
}

以上です。

次回はこのサンプルプログラムにファセット検索、ハイライト機能などを追加してみたいと思います。

著者プロフィール

toza

ミドルウェアから上の層を色々とやってます。長春系八極拳使い。

記事一覧Index