Apache Solr を 60 秒で試してみる
今回も Java で全文検索です。
前回は Apache Lucene を試しましたが
『検索エンジンの常識をApache Solrで身につける』
ということで Apache Solr のデモも試してみました。
もちろん、今回も誰でも 60秒で デモを試せるように Gradle スクリプトを作ってみました。
Solr も Gradle を使えば たった 3ステップ + α で気軽に試せるので、 全文検索に少しでも興味のある方は ぜひ、試してみてください。
- build.gradle 作成
- Solr 起動
- インデックス作成
- 全文検索 実行
- 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 にリクエストを投げて返ってきた検索結果を利用できるんです。