2012年1月15日

Solr の trunk を使ってみる

調べ物をするときにソースコードがあった方が便利な場合もありますので、 Lucene/Solr の trunk のソースコードを取得して動かしてみます。

Java と Ant と Subversion はインストール済とします。

ソースコードをチェックアウトする

ASF のプロジェクトのお作法に従ってチェックアウトします。 詳しくはこちらのページを参照。

$ svn co http://svn.apache.org/repos/asf/lucene/dev/trunk lucene-solr

(出力省略)

中身を確認しておきます。

$ cd lucene-solr/
$ ls
README.txt  build.xml   dev-tools/  lucene/     modules/    solr/

ソースコードをビルドする

build.xml のターゲットを確認しておきます。

$ grep "<target" build.xml
  <target name="test" description="Test both Lucene and Solr" depends="validate">
  <target name="javadocs" description="Generate Lucene and Solr javadocs">
  <target name="validate" description="Validate dependencies, licenses, etc.">
  <target name="compile" description="Compile Lucene and Solr">
  <target name="get-maven-poms"
  <target name="generate-maven-artifacts" description="Generate Maven Artifacts for Lucene and Solr">
  <target name="eclipse" description="Setup Eclipse configuration">
  <target name="idea" description="Setup IntelliJ IDEA configuration">
  <target name="clean-idea"
  <target name="clean" description="Clean Lucene and Solr">

compile でコンパイルしてくれますので、これを実行してしばらく待ちます。 一応、時間も計測しておきましょう。(Ant 自体が時間を出力するので、 time コマンドはなくても良い。)

$ time ant compile

(出力省略)

BUILD SUCCESSFUL
Total time: 58 seconds

real    0m58.528s
user    1m16.734s
sys     0m7.490s

次に、Solr の example 用に必要なファイルをコピーします。

$ cd solr
$ time ant example

(出力省略)

example:
     [copy] Copying 1 file to /Users/shigeru/workspace/lucene-solr/solr/example/webapps
      [jar] Building jar: /Users/shigeru/workspace/lucene-solr/solr/example/exampledocs/post.jar
     [echo] See /Users/shigeru/workspace/lucene-solr/solr/example/README.txt for how to run the Solr example configuration.

BUILD SUCCESSFUL
Total time: 25 seconds

real    0m26.300s
user    0m36.986s
sys     0m4.495s

最後の echo 部分で「README.txt を見てね」と出力されていますので、 読んでおきましょう。

サンプルを動かしてみる

example ディレクトリにサンプルがありますので、 これを使って簡単なテストを実施します。 README.txt に書かれていることでもあります。

Jetty を使って起動する

example ディレクトリに移動して起動させます。

$ cd example
$ java -jar start.jar

(出力省略)

2012-01-14 22:42:16.215:INFO::Started SocketConnector@0.0.0.0:8983

最後に、8983番ポートで待ち受けているログが出力されていますね。

管理画面を表示する

ブラウザで "http://localhost:8983/solr/admin/" にアクセスすると管理画面を表示できます。 設定ファイルの表示や、クエリの確認などができます。

インデクスを追加する

example/exampledocspost.jarpost.sh というファイルがあります。 これが XML を投げるプログラムになっており、引数でインデクスに追加するファイルを指定します。

サーバを起動しているのとは異なるターミナルを起動し、 exampledocs ディレクトリまで移動します。 このディレクトリにはサンプルの XML がありますので、 それらのすべてをインデクスに追加します。

$ cd {your-lucene-solr-trunk}
$ cd solr/example/exampledocs

$ java -jar post.jar *.xml
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file gb18030-example.xml
SimplePostTool: POSTing file hd.xml
SimplePostTool: POSTing file ipod_other.xml
SimplePostTool: POSTing file ipod_video.xml
SimplePostTool: POSTing file manufacturers.xml
SimplePostTool: POSTing file mem.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: POSTing file monitor2.xml
SimplePostTool: POSTing file mp500.xml
SimplePostTool: POSTing file sd500.xml
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file utf8-example.xml
SimplePostTool: POSTing file vidcard.xml
SimplePostTool: COMMITting Solr index changes..

最後にコミットも発行されています。 サーバ側のログにもコミットされたとのメッセージが出力されています。

インデクスに追加する XML の書式は、Wiki に記載されています。

フィールド名などは schema.xml と統一しておく必要がありますので、 自分でカスタマイズする場合にはこのファイルも確認しておきましょう。

なお、インデクスを更新するには、XML 以外にも CSV や DIH (Data Import Handler) も使えます。 DIH のサンプルは example/example-DIH にあります。

検索してみる

"q" パラメータに検索式を記載して検索してみます。 "q" パラメータの記法は Lucene 由来で、次のページに記述されています。 AND, OR, NOT といった条件も確認できます。

実際に、id フィールドが "apple" のドキュメントを検索します。 ヒューマンリーダブルにするため、"indent=true" も追加しておきます。

$ curl "http://localhost:8983/solr/select?q=id:apple&indent=true"
<?xml version="1.0" encoding="UTF-8"?>
<response>

<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">4</int>
  <lst name="params">
    <str name="indent">true</str>
    <str name="q">id:apple</str>
  </lst>
</lst>
<result name="response" numFound="1" start="0">
  <doc>
    <str name="id">apple</str>
    <str name="compName_s">Apple</str>
    <str name="address_s">1 Infinite Way, Cupertino CA</str></doc>
</result>
</response>

デフォルトでは XML で出力されますが、 "wt" パラメータを指定すると JSON でもレスポンスを取得できます。

$ curl "http://localhost:8983/solr/select?q=id:apple&indent=true&wt=json"
{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "indent":"true",
      "wt":"json",
      "q":"id:apple"}},
  "response":{"numFound":1,"start":0,"docs":[
      {
        "id":"apple",
        "compName_s":"Apple",
        "address_s":"1 Infinite Way, Cupertino CA"}]
  }}

おわりに

Solr の trunk のソースコードを取得し、自分でビルドしてサンプルを動かしました。 trunk 特有のことは何もしていませんが、とりあえず環境を作っておくと便利かな、と。

あと、こんなイベントもあったんですね。行けばよかった。。

コメントを投稿