Apache Solr を 60 秒で試してみる

今回も Java全文検索です。
前回は Apache Lucene を試しましたが 『検索エンジンの常識をApache Solrで身につける』 ということで Apache Solr のデモも試してみました。
もちろん、今回も誰でも 60秒で デモを試せるように Gradle スクリプトを作ってみました。

Solr も Gradle を使えば たった 3ステップ + α で気軽に試せるので、 全文検索に少しでも興味のある方は ぜひ、試してみてください。

  1. build.gradle 作成
  2. Solr 起動
  3. インデックス作成
  4. 全文検索 実行
  5. Solr 停止

build.gradle 作成

まずは適当なディレクトリに 次のスクリプトを build.gradle と言う名前で保存します。
以下の 「view raw」の リンク先を保存するのが簡単です。
もちろん今回も スクリプトの詳細は抜きと言うことで、Solr を楽しみましょう。

Solr 起動

まずは いきなり Solr を起動してみましょう。

gradle start
を実行すれば、初回起動時に 勝手に必要なファイルをダウンロードしてカレントディレクトリに 展開します。
自分でわざわざ環境を作る必要はありません。
今回は Solr のデモを試すだけなので もちろん example に含まれている Jetty を使っています。

初回起動時は 少し時間がかかりますが、"BUILD SUCCESS" と表示されれば OK です。
これで Solr が起動されたはずなので 好きなだけ 全文検索を楽しみましょう。
手始めに http://localhost:8983/solr/admin にアクセスしてみましょう。
以下のような 管理画面が表示されるはずです。

と言っても まだ インデックスを作成していないので検索しても何もヒットしませんが ANALYSIS あたりで遊んでみると面白いかもしれません。

インデックス作成

では 早速インデックスを作成してみましょう。
通常はここで XML ファイルを手で作成して Solr に POST するというのが慣例のようですが そんなの面倒なので

gradle index
を実行しましょう。
これで前回と同様に lucene-core-3.5.0-sources.jar 内のソースファイルの内容が Solr に POST されて インデックスが作成されます。
今回は solrj と言う Java 用のクライアントライブラリを使用しているので
    def server = new CommonsHttpSolrServer(serverurl)
    server.deleteByQuery("*:*")
    server.add(fileTree(dir: 'src').collect { f ->
        println f
        def doc = new SolrInputDocument()
        doc.addField( "id", f.path, 1.0f )
        doc.addField( "text", f.text)
        return doc
    })
    server.commit()
を実行して、Solr 起動時に あらかじめ src 配下に展開しておいた lucene-core-3.5.0 のソースファイルの情報を Solr に送信しています。
がんばって XML なんて書かなくたって たったこれだけで大量のインデックスが作成できるんです。とても簡単ですね!!
しかも 実際は HTTP で通信しているだけですので どんな言語からでも利用できると言うのがすばらしい。

全文検索 実行

折角なので ブラウザから検索してみましょう。
http://localhost:8983/solr/select?q=reader&rows=1000 をクリックしてみてください。
ブラウザに XML が表示されるはずです。

XML を表示しても なんかピンとこないので

gradle ?reader
を実行して 前回と同じように該当するファイルのパスを出力してみましょう。
今回の全文検索に必要なコードは
def query = new SolrQuery(taskName[1..-1]).set("rows", 1000)
new CommonsHttpSolrServer(serverurl).query(query).results.each {
    println it.getFieldValue("id")
}
の4行だけです。とっても簡単ですね。
たったこれだけで Solr にリクエストを投げて返ってきた検索結果を利用できるんです。

Solr 停止

全文検索を十分満喫したら

gradle stop
で Solr を停止しておきましょう。

うまく Solr を満喫できましたか?
Solr を使えば クライアント側から全文検索を分離できるので開発が楽にできそうです。
もちろん、全文検索側のチューニング等はいろいろと大変そうですが...
ちなみに今回も日本語の検索は正しくできません。
次回は 日本語を考慮した検索も試せるようにしてみようかな...