Solrのクライアントプログラミング with SolrJ

ここのところ、最近改訂版が出た↓のApache Solr入門を読んでいるのですが、 sortMissingLastの設定とか、カタカナのステミング(例:サーバー⇒サーバ)とか、omitNormsが〜とか、 実際に手を動かして試してみたいものの、手でJSONXMLを書くのも面倒くさすぎる、、ということで、 Chapter5 の クライアントプログラミング から進めていきたいと思います。

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン  (Software Design plus)
大谷 純 阿部 慎一朗 大須賀 稔 北野 太郎 鈴木 教嗣 平賀 一昭
技術評論社
売り上げランキング: 6,004

  ■ SolrJ依存ライブラリ   以前Tomcat上に構築したSolrのログ出力に関して使うjarファイルをまとめたことがあるのですが、 Solr用のクライアントライブラリであるSolrJにおいてもいろいろ必要になります。   まずはSolr本体をダウンロードして解凍します。

$ curl -O  http://www.dsgnwrld.com/am/lucene/solr/4.6.0/solr-4.6.0.tgz
$ tar xvf solr-4.6.0.tgz
$ cd solr-4.6.0/dist/solrj-lib

ココには以下のjarファイルが入っています。 #若干書籍とバージョン変わっていますが、on goingなプロダクトなので。。。 - commons-io-2.1.jar - httpclient-4.2.6.jar - httpcore-4.2.5.jar - httpmime-4.2.6.jar - jcl-over-slf4j-1.6.6.jar - jul-to-slf4j-1.6.6.jar - log4j-1.2.16.jar - noggit-0.5.jar - slf4j-api-1.6.6.jar - slf4j-log4j12-1.6.6.jar - wstx-asl-3.2.7.jar - zookeeper-3.4.5.jar で、実際の動作には slf4j-jdk14-1.6.6.jar が必要なのだそうです。     ■ SolrJ実行環境   Java屋な自分としてはEclipseMavenプロジェクトを作って、SolrJを叩けるmain文なプログラムを作ってみます。 スクリーンショット 2013-12-10 13.53.15   上記のjarファイルの依存に関してはpom.xmlを↓に置いておいたのでご参考まで。 https://github.com/shinodogg/TrySolrJ/blob/master/pom.xml   SolrJでは、SolrServerというクラスを介してSolrとのやりとりを行うわけですが、 実装クラスは以下のようになっています。 - HttpSolrServer - EmbeddedSolrServer - LBHttpSolrServer - CloudSolrServer - ConcurrentUpdateSolrServer

↓3年以上前は上から3つまでしかなかったのですが、クラウドやコンカレントといったクラスが追加されています。 http://shinodogg.com/?p=3027   今回は一番ベーシックな HttpSolrServer で試してみます。     スキーマ設定とデータ投入   こちらはApache Solr入門のChapter2とChapter3を元にして行っていきます。

Solrは普通に内包されているJettyで起動できることを確認後落としておいて、

$ java -jar start.jar
0    [main] INFO  org.eclipse.jetty.server.Server  – jetty-8.1.10.v20130312
29   [main] INFO  org.eclipse.jetty.deploy.providers.ScanningAppProvider  – Deployment monitor /Users/eshinoha/solr/solr-4.6.0/example/contexts at interval 0
36   [main] INFO  org.eclipse.jetty.deploy.DeploymentManager  – Deployable added: /Users/eshinoha/solr/solr-4.6.0/example/contexts/solr-jetty-context.xml

  solrbookディレクトリを作って、collection1からconfをコピって、 技評のサポートページからダウンロードしたsolrbook.zipのconfもコピって、 もう一度、Solrを起動します。

$ mkdir solrbook
$ cp -r collection1/conf solrbook/
$ cp -r /Users/xxx/Downloads/solrbook/sampledata/solrbook/conf/* solrbook/conf/
$ cd ../
$ java -jar start.jar

  ↓のようにAdd Coreしてやります。 スクリーンショット 2013-12-10 16.01.38   でもって、そこにデータ投入してコミットします。

$ curl http://localhost:8983/solr/solrbook/update --data-binary @sample-books.xml -H 'Content-type:text/xml;charset=utf-8'
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">4171</int></lst>
</response>
$ curl http://localhost:8983/solr/solrbook/update?commit=true
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">1059</int></lst>
</response>

  ↓のようにデータが入ったことを確認出来ました。 スクリーンショット 2013-12-10 16.17.28     Javaプログラムからデータ投入   EclipseMavenで環境作って、ローカルにサーバー立てて、スキーマ定義して、データ投入して、、 いよいよJavaのプログラムを実行してみます。

    public static void main( String[] args ) throws SolrServerException, IOException
    {
        String url = "http://localhost:8983/solr/solrbook";
        SolrServer server = new HttpSolrServer(url);

        SolrInputDocument document = new SolrInputDocument();
        document.addField("url","http://gihyo.jp/ThisIsSample1");
        document.addField("title","はじめてのSolr");
        String[] authors = {"山田太郎", "鈴木一郎"};
        document.addField("author", authors);
        document.addField("summary", "この書籍はフィクションです");
        server.add(document);
        server.commit();
    }

  ↓こんな感じ。 スクリーンショット 2013-12-10 16.27.25     Javaプログラムから検索   上記のSolrServerを使う感じで↓のように検索できます。

SolrQuery query = new SolrQuery();
query.setQuery("山田太郎");
QueryResponse res = server.query(query);
for(SolrDocument document : res.getResults()) {
    for(String name : document.getFieldNames()) {
        System.out.println(name + ": " + document.get(name));
    }
    System.out.println("----------");
}

  ↓結果はこんな感じ。

url: http://gihyo.jp/ThisIsSample1
title: はじめてのSolr
author: [山田太郎, 鈴木一郎]
summary: [この書籍はフィクションです]
_version_: 1454018793066987520
----------
summary: [1冊で言語仕様から最新の技術までを網羅した内容。網羅的に解説されているだけでなく,各技術に関しては基本からしっかり解説し,フレームワークなどを利用したWebアプリケーション開発の解説などは,内部処理が裏で何をしているのかを掘り下げて解説してあるため,PHPを体系的に学びたい方はもちろん,より深い知識を得たい中~上級者にもお勧めの一冊である。]
genre: [プログラミング・システム開発, JavaScriptPerlRubyPHPなど]
author: [小川雄大, 柄沢聡太郎, 橋口誠]
title: パーフェクトPHP
intended_reader: [PHPで仕事をしているエンジニア, PHPでWebアプリケーション開発をしているエンジニア]
price: 3780
pub_date: 20101112
isbn: 978-4-7741-4437-5
pages: 592
url: http://gihyo.jp/book/2010/978-4-7741-4437-5
_version_: 1454017832355364864
----------
summary: [サーバについて,実用的な知識を学習するために役に立つ解説書です。国内最大規模のシステムを構築運用し,ITProでもサーバ管理者日記を連載している佐野裕氏をはじめ,サーバ運用経験豊富な著者達が,実際に現場で「このくらいは知っていて欲しい」と思われる知識をまとめました。, それぞれの項目について具体的な例を挙げながら,それが何のために必要なのかを含めて解説します。サーバとは何かといった入門から,サーバをとりまくネットワーク環境の学習書として広くお使いいただけます。]
genre: [ネットワーク・UNIX・データベース, サーバ・LAN・公衆無線LAN]
author: [小島太郎, 佐藤尚孝, 佐野裕]
title: これだけは知っておきたい サーバの常識
intended_reader: [サーバを初めて学習する学生の教材として, SE やシステム管理者など,ネットワーク/サーバ携わる人の全般的な知識の向上, 各種サーバを利用しているユーザが仕組みを理解するために]
price: 1764
pub_date: 20091028
isbn: 978-4-7741-4039-1
pages: 184
url: http://gihyo.jp/book/2009/978-4-7741-4039-1
_version_: 1454017833702785024
----------
summary: [プログラミング言語をやさしく解説する「今すぐ使えるかんたんプラス」シリーズのデータベース編です。これからMySQLを始める人のために,データベースおよびMySQLの基本を徹底解説します。実際にMySQLの操作を行いながら,予習→体験→理解の3つのプロセスを踏むことで,MySQLの基礎がしっかり,やさしく身に付きます! 「今すぐ使えるかんたんプラス 3ステップでしっかり学ぶ Oracle入門」も同時発売です。]
genre: [ネットワーク・UNIX・データベース, データベース・SQLなど]
author: [山田祥寛, 山田奈美]
〜略〜

    ■ ということで、、   プログラムからデータを投入したり、検索したりといったところが出来るようになったので、 これから手動かしながら検証進めたいと思います。    

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン  (Software Design plus)
大谷 純 阿部 慎一朗 大須賀 稔 北野 太郎 鈴木 教嗣 平賀 一昭
技術評論社
売り上げランキング: 3,804