2013年4月17日

Amazon EC2 で Solr 4 を動かす

Amazon の EC2 で Solr 4 を動かしてみます。 Web アプリケーションのコンテナには Tomcat を使います。 基本的なことは Solr の Wiki に書かれています。

この記事では、Amazon Linux でインスタンスを立ち上げて、Tomcat を使って Solr を動かす手順を紹介します。

準備

まずは EC2 のインスタンスを立ち上げて、ssh と http のポートを開放するようなセキュリティグループを割り当てます。 EMI は Amazon Linux の 2013年3月版を使います。

インスタンスが立ち上がったら ssh でログインして Java と Tomcat、それから Apache をインストールします。 これらは標準のパッケージ管理システムで提供されていますので、 yum でインストールできます。

$ sudo yum update
$ sudo yum install -y java-1.7.0-openjdk tomcat7 httpd24

標準では Tomcat は Java 6 を使っていますので、 alternatives コマンドを使ってバージョンを切り替えておきます。 出力メッセージを読んで、対話的に番号を選択しましょう。

$ sudo alternatives --config java
$ java -version

これで Tomcat と Apache を起動してみます。

$ sudo service tomcat7 start
$ sudo service httpd start

Web ブラウザを立ち上げて、80番ポートでパブリックIPへのアクセスが可能であることを確認しておきましょう。

Solr の配置

Solr のアーカイブをダウンロードしてから展開し、Solr 用のディレクトリにサンプルファイルなどを配置します。 Solr の配布パッケージにある example の設定ファイルを /usr/local/solr4 にコピーしましょう。 ファイルなどの所有者は tomcat にしておきます。

$ SOLR_VERSION=4.2.1
$ curl -O "http://ftp.riken.jp/net/apache/lucene/solr/$SOLR_VERSION/solr-$SOLR_VERSION.tgz"
$ tar xzf solr-$SOLR_VERSION.tgz
$ sudo cp -r solr-$SOLR_VERSION/example/solr /usr/local/solr4
$ sudo cp solr-$SOLR_VERSION/dist/solr-$SOLR_VERSION.war /usr/local/solr4/solr.war
$ sudo chown -R tomcat:tomcat /usr/local/solr4

次に、Tomcat のコンテキストを設定します。 solr4.xml という名前で下記のファイルを作成します。 WAR へのパスと、 SOLR_HOME を定義します。

<?xml version="1.0" encoding="utf-8"?>
<Context docBase="/usr/local/solr4/solr.war" debug="0" crossContext="true">
      <Environment name="solr/home" type="java.lang.String" value="/usr/local/solr4" override="true"/>
</Context>

このファイルを /usr/share/tomcat7/conf/Catalina/localhost 以下にコピーします。

$ sudo cp solr4.xml /usr/share/tomcat7/conf/Catalina/localhost/solr4.xml

これで Tomcat が /solr4 というコンテキストを認識できるようになります。 Tomcat のコンテキストに関しては公式ドキュメントに記載されています。

続いて、Apache のプロキシの設定も追加しておきましょう。 下記のようにファイルを用意します。 認証が必要な場合、CORS 対応のヘッダーを追加したい場合などは、ここで記述しておくと良いでしょう。

$ cat /etc/httpd/conf.d/proxy.conf
ProxyRequests Off
ProxyPass /solr4 http://localhost:8080/solr4
ProxyPassReverse /solr4 http://localhost:8080/solr4

<Location "/solr*">
        Order allow,deny
        Allow from all
</Location>

最後にミドルウェアを再起動して変更を反映させます。

$ sudo service tomcat7 restart
$ sudo service httpd reload

Web ブラウザで、パブリックIPに /solr4 を付けてアクセス可能ならば成功です。

インデクスの作成

郵便局が発行している郵便番号データを検索用にインデクシングしてみます。

ZIP アーカイブをダウンロードして展開し、文字エンコーディングを UTF-8 に変換します。

$ curl -O "http://www.post.japanpost.jp/zipcode/dl/oogaki/zip/ken_all.zip"
$ unzip ken_all.zip
$ iconv -f shift_jis -t utf8 KEN_ALL.CSV > ken_all_utf8.csv

実際の問題に取り組む場合はスキーマを設計してからインデクスを作成すべきですが、 まずは example のスキーマに無理矢理当てはめて簡単なインデクスを作成します。 CSV ファイルの先頭10件だけを扱い、郵便番号を id、住所名を name として XML を生成します。 実際には郵便番号の重複がありますので ID には成り得ませんが、先頭10件だけならば重複はありません。

手軽に始めるときには、次のようなスクリプトで XML を生成できます。 実際の運用においては、もっときちんとしたツール類を用意することになるでしょう。

$ head -n 10 ken_all_utf8.csv |
    sed 's/"//g' |
    awk -F"," '
        BEGIN { print "<add>" }
        END { print "</add>" }
        {
            print "<doc>"
            printf "  <field name=\"id\">%s</field>\n", $3
            printf "  <field name=\"name\">%s%s%s</field>\n", $7, $8, $9
            print "</doc>"
        }
    ' > ken_all.xml

この XML ファイルを Solr の /update ハンドラに HTTP で投げます。 登録した後は、検索可能になるようにコミットも実行させましょう。

$ URL="http://localhost/solr4/update"
$ fname=ken_all.xml
$ curl $URL --data-binary @$fname -H 'Content-type:application/xml'
$ curl "$URL?softCommit=true"

今度は検索してみます。"wt=json" を指定していますので、JSON で結果が返ってくれば成功です。

$ URL="http://localhost/solr4/select"
$ curl "$URL?q=*&sort=id+asc&wt=json&indent=on"    # すべて
$ curl "$URL?q=%E4%B8%80%E6%9D%A1&sort=id+asc&wt=json&indent=on"  # 「一条」で検索

example の設定では「一条」という単語は「一」と「条」に分解され、「二条」という地名も検索結果に含まれます。 「どの文字がどのフィールドでどのように処理されたか?」という情報は、管理画面の「Analysis」で確認できます。 設定を変更してこうした結果を改善していくことが次のステップだと言えます。 とは言え、ひとまず Solr4 が動くことまで確認できました。

/update ハンドラは XML 以外に CSV と JSON でもデータの登録を受け付けています。 詳しくは Solr の Wiki に記載されていますので、好みの形式にデータを変換するのが良いでしょう。

終わりに

Amazon の EC2 で Solr 4 を動かしてみました。 基本的なことは Solr の Wiki に書かれていますので、それらを組み合わせてまとめ直しました。 AWS のマーケットプレイスにも Solr 用の EMI がありますが、最新バージョンを使うためには自分でセットアップできる必要があります。

以前に下記の記事を書きましたが、この時とはミドルウェアの組み合わせを変えてあります。 性能と運用の両面で検討することが望ましいと言えます。

テストデータに関しては、Wikipedia を使うのも良いと思います。 DIH (Data Import Handler) を使った方法は下記の記事が参考になるかもしれません。

Solr は HTTP での通信が主になりますので、セットアップさえ終わってしまえば、 様々なマシンからインデクスを更新したり検索することが可能になります。 凝ったツールを用意しなくとも、Web ブラウザを基本として利用できるのです。

また、Solr 4 以降では管理画面が刷新され、非常に使いやすくなりました。 検索処理がメインの機能であることは間違いありまえせんが、こうした周辺ツールも順調に改善されているのは嬉しいですね。

コメントを投稿