Apache Solr

install

% apt-cache search solr
solr-common - enterprise search server based on Lucene - common files
solr-tomcat5.5 - enterprise search server based on Lucene - Tomcat integration

という事のようなのでsolr-tomcat5.5をチョイスしてみるとtomcatから何からもっさり入るよう。ただ、最初からこのパッケージだとどうにも掴み辛そうな気がしたのでjavaだけ入った状態でノンパッケージでやってみる事に(javaだとこのパターン結構あるな…)

% java -version                                               
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01, mixed mode)

http://www.apache.org/dyn/closer.cgi/lucene/solr/

この辺より取る。1.4.1が最新版でした

お試し起動

この手のアプリケーションではよくある事みたいですが、スタンドアロンで起動してしまうようでapache-solr-1.4.1/exampleとかに移動してstart.jarというのを叩くと起動します。デフォルトポートは8983です。

% java -jar start.jar 

http://server:8983/solr/admin とかでadminインタフェースに入れます。

お試しデータ

example/exampledocsという所をみると様々なxmlやらcsvやらが置いてあり、かつpost.shというのがあります。中をみるとこんな具合

post.sh

FILES=$*
URL=http://localhost:8983/solr/update
 
for f in $FILES; do
  echo Posting file $f to $URL
  curl $URL --data-binary @$f -H 'Content-type:text/xml; charset=utf-8'
  echo
done
 
#send the commit command to make sure all the changes are flushed and visible
curl $URL --data-binary '<commit/>' -H 'Content-type:text/xml; charset=utf-8'
echo

まあこのような素朴なシェルスクリプトで、http://localhost:8983/solr/updateに対してPOSTリクエストをかけるというもの。これをみるとデータを登録して、最後に<commit/>というリクエストを投げてトランザクションをコミットしているっぽいのが見て取れます。 なお、何のことわりもなくcurlを使ってるので入れる必要があります(どうしても集められなければpost.jarというのもあります)

ではやってみよう。

% ./post.sh *.xml  

わらわらと情報が返ってきますが、これはresponseデータでしょか。

登録がうまくいったかどうかはhttp://localhost:8983/solr/admin/等にアクセスして[Statics]からNumDocsの値をみます。19になっていれば登録されています。

他には、Make a QueryからXMLに書いてありそうな単語(たとえばcanonとか)で検索します。

二度送っちゃったらどうなるの?

たとえばpost.shを二度叩いちゃった場合でも増えません。これはユニークキーが定義されているから。後述します

日本語検索を試す

ngram(bigram, 2gram)一択。形態素解析はしません(キリリッ

example/solr/conf/schema.xmlを開いて<types>のところに追記

  <types>
    <!-- ここから -->
    <fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100" >
      <analyzer>
        <tokenizer class="solr.CJKTokenizerFactory"/>
      </analyzer>
    </fieldType>
    <!-- ここまで -->

これでsolrを再起動すればtext_cjkタイプが使えるようになると。トークナイザーclassは同梱されているので特に何かを取ってくるとかは必要ないです。

adminからanalyzeしてtext_cjkタイプが使えるかどうか確認。

(index)には検索対象の文字列、(query)には検索するべき文字列をいれるのだけど、大事なのはFieldでtypeを選択し、先程定義したtext_cjkを指定する事。これでどのように分解されているのか分析できます。便利。

サンプルをさらに見てみる

サンプルで登録したXMLの書式をみてみましょう

mem.xml

<add>
<doc>
  <field name="id">TWINX2048-3200PRO</field>
  <field name="name">CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail</field>
  <field name="manu">Corsair Microsystems Inc.</field>
  <field name="cat">electronics</field>
  <field name="cat">memory</field>
  <field name="features">CAS latency 2, 2-3-3-6 timing, 2.75v, unbuffered, heat-spreader</field>
  <field name="price">185</field>
  <field name="popularity">5</field>
  <field name="inStock">true</field>
  <field name="manufacturedate_dt">2006-02-13T15:26:37Z</field>
</doc>
<!-- .. 略 -->
</add>

これは、おそらくある種のWeb販売ネタと考えて良いでしょう。

大体の意味を推測してみると

  • id: 一意な商品ID
  • name: 商品名。割と長いテキストが与えられている可能性もある
  • cat: カテゴリ。複数のカテゴリに所属する場合もある
  • features: 機能。割かし自由記述性が高い
  • price: 値段。ドルとかでしょうか。まあどうでもいいけど数値
  • popularity: 人気の度合い?
  • inStock: 在庫のあり/なし
  • manufacturedate_dt: 製造日

という具合で定義されている模様。もっとも、これは適当に定義されているわけではなくスキーマによってガチガチに決める感じです。(この辺はhyperestraierのattribute検索とは大きく異なる所かも)

なので、これらのフィールド値はしっかり定義してあるというわけで、サーバ側の定義値をみてみましょう。

solr.txt · 最終更新: 2012/04/07 10:32 (外部編集)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0