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

ここのところ、最近改訂版が出た↓のApache Solr入門を読んでいるのですが、
sortMissingLastの設定とか、カタカナのステミング(例:サーバー⇒サーバ)とか、omitNormsが〜とか、
実際に手を動かして試してみたいものの、手でJSONやXMLを書くのも面倒くさすぎる、、ということで、
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屋な自分としてはEclipseでMavenプロジェクトを作って、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つまでしかなかったのですが、クラウドやコンカレントといったクラスが追加されています。


 
今回は一番ベーシックな 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プログラムからデータ投入
 
Eclipse&Mavenで環境作って、ローカルにサーバー立てて、スキーマ定義して、データ投入して、、
いよいよ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: [プログラミング・システム開発, JavaScript・Perl・Ruby・PHPなど]
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

コメント

  1. […] みます。 先日 SolrJを使ったクライアントプログラミングのブログを書きましたが⇒http://shinodogg.com/?p=5899 ソレを活用してやってみます。   インデクシングするコードは↓こんな感じ。 […]

  2. […] ■ Search Data Format (SDF)   Amazon CloudSearchでデータをインデクシングするのにSDFというフォーマット(JSONもしくはXML)で データをアップロードする必要がありますが、2014年1月現在、以下の方法があります。 1. コマンドラインツールをインストールしてcs-import-documentsコマンドを使う 2. ManagementConsoleでブラウザからポチポチする 3. DocumentEndpointに直接curl等でPOSTする   SDFフォーマット的には↓に詳しく記載されていますが、 http://aws.amazon.com/articles/8871401284621700#_Ref198105621   以下のような情報が必要な感じになります。 – 操作種別(add/delete) – 一意の識別子 – バージョン番号 – 言語コード(en) – 実際のフィールドとデータ     ■ SDKを使って開発しているのでその中でやりくりしたい   先日、Solrをイジっていて、SolrJでクライアントプログラミングしてみました(http://shinodogg.com/?p=5899)が、 ソレと同じようなノリで、Javaのオブジェクトを作って、そのままインデクシングしたいな、と。     ■ まずはAmazon CloudSearchに検索サーバーを準備してSDKからアクセス   CloudSearchにDomainを定義します。 (後からtextフィールドもresultのチェック入れましたが、件数なくてもActiveになるまでそこそこ時間かかります)   JavaのSDKのCloudSearchなクラスを使ってアクセスしてみます。   – CloudSearchのクライアント。リージョンはVirginia(まだ日本にきてないので) […]

タイトルとURLをコピーしました