Code4Lib 2011参加報告会&Camp Day2 - @yegusa が雪で閉じ込められたアメリカで学んだSolrの復習を兼ねてインストールの巻

Code4Lib 2011参加報告会&Camp Day2での一コマ。
2
Yuka Egusa @yegusa

えー、Rubyプログラミングだけだっていうから、rubyの準備だけしたのに、やっぱ、solrもrsolrもないとだめじゃん。もう #c4ljp

2011-03-06 12:19:13
Yuka Egusa @yegusa

うーん、ここからは、twitterでメモるのは難しいかな。まで、でも挑戦してみる。 #c4ljp

2011-03-06 12:32:44
Yuka Egusa @yegusa

rubyを使ってsolrにインデックスを作るためにまずは、rsolrのお試しからやる。 #c4ljp

2011-03-06 12:34:38
Yuka Egusa @yegusa

index.rb とファイルをサンプルとして作ってみる。ポート8888で、query:solrで検索した結果を出力するスクリプト #c4ljp

2011-03-06 12:51:45
Yuka Egusa @yegusa

#c4ljp----require 'rubygems'require 'rsolr'solr = RSolr.connect :url => 'http://localhost:8888/solr'

2011-03-06 12:53:08
Yuka Egusa @yegusa

#c4ljp つづき----response = solr.get 'select', :params => {:q => 'solr'}p response

2011-03-06 12:53:32
Yuka Egusa @yegusa

ま、こんなかんじ。 % ruby index.rb としたら、エラーじゃなく、なんか出たらOK。もち、solrを起動しとかないとだめよ。 #c4ljp

2011-03-06 12:54:52
Yuka Egusa @yegusa

というわけで、インデサのサンプルができたので、次は、スキーマ設計。example/solr/conf/schema.xmlを修正する。 #c4ljp

2011-03-06 12:58:00
Yuka Egusa @yegusa

手元の開発ディレクトリに、schema.xmlをコピーする。そして、オリジナルは、mv しといて、コピーしといた先へシンボリックリンク張って、solrを再起動しておくと、あとは、開発ディレクトリないのschmea.xmlがそのまま反映されるので楽。 #c4ljp

2011-03-06 13:08:15
Yuka Egusa @yegusa

フィールド名、データの型を登録する。まずは、書誌ID(id), 書名(title)を登録することにしてみる。 #c4ljp

2011-03-06 13:14:56
Yuka Egusa @yegusa

じつは、すでに、サンプルのschama.xmlにはidとtitleのフィールドがあるので、そのまま流用することにする。 #c4ljp

2011-03-06 13:15:31
Yuka Egusa @yegusa

書誌ID(id)はこんな感じ。 <field name="id" type="string" indexed="true" stored="true" required="true" /> #c4ljp

2011-03-06 13:16:32
Yuka Egusa @yegusa

<field name="id" フィールド名 type="string" は、分かち書きするデータの意、indexed="true" インデックスを作る、 stored="true" これなんだっけ。 required="true" 必須入力 #c4ljp

2011-03-06 13:19:12
Yuka Egusa @yegusa

書名はこんなかんじ <field name="title" type="text" indexed="true" stored="true" multiValued="true"/> #c4ljp

2011-03-06 13:19:40
Yuka Egusa @yegusa

type="text" 分かち書きしてインデックス作る(vs idのときはstringで分かち書きしない) multiValued="true" 複数回OK #c4ljp

2011-03-06 13:20:47
Masao Takaku @tmasao

Solrの日本語フィールド定義:<fieldType name="text" class="solr.TextField"> <analyzer type="index" class="org.apache.lucene.analysis.cjk.CJKAnalyzer">

2011-03-06 13:30:07
Yuka Egusa @yegusa

書名(title)はtype="text"として、分かち書きとしたわけだけど、textはデフォルトは空白で分かち書きするようになっているので、@tmasaoが書いたようにschema.xmlのfildType="text" の定義を一部修正する。 #c4ljp

2011-03-06 13:32:24
Yuka Egusa @yegusa

スキーマをいじったら、サーバの再起動(java -Djetty.port=8888...)、インデックスのしなおし(%ruby index.rb)、そして検索してみる #c4ljp

2011-03-06 14:04:12
Yuka Egusa @yegusa

よし、「title:社会」ではヒットしたぞ。あれ、なんで「title:新しい」じゃヒットしない?(例:新訂新しい社会科地図) #c4ljp

2011-03-06 14:05:11
Yuka Egusa @yegusa

なんと、queryのところの<analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> も同様に修正必要らしい。 #c4ljp

2011-03-06 14:06:08
Yuka Egusa @yegusa

ちなみに、solrはidが同じだったら、そのレコードは上書きするので、何も考えずに、インデックスを実行(今回だと ruby index.rb)すればよい #c4ljp

2011-03-06 14:11:56
Yuka Egusa @yegusa

#c4ljp そうそう、今回の、index.rbのインデックスをしているところはこんな感じでかいてます。solr.add( { :id => "EB10009744", :title => "新訂新しい社会科地図" } )solr.commit

2011-03-06 14:18:20
Yuka Egusa @yegusa

プログラム実書きのサンプルがうまくいったので、tsvファイルからidとtitleを追加するように変更。 #c4ljp

2011-03-06 14:48:37
Yuka Egusa @yegusa

検索して見る。うまくいった~。注:最初の数件しかレコードはでませんよ。途中、文字コードがSJISだったとか、空行の処理などひっかかりつつ(ありがち)、なんとかできた。 #c4ljp

2011-03-06 14:51:30