2010年06月22日

Solr + MySQL 日本語データを試す

前の記事では MySQL に入れたデータは全部英語でしたが、日本語を入れるとどうなるのか試してみました。

ちなみに database, table の文字コードは
mysql> SHOW CREATE DATABASE products;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| products | CREATE DATABASE `products` /*!40100 DEFAULT CHARACTER SET ujis */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE maker \G;
*************************** 1. row ***************************
       Table: maker
Create Table: CREATE TABLE `maker` (
  `mid` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(16) NOT NULL,
  PRIMARY KEY  (`mid`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=ujis
1 row in set (0.01 sec)
という感じで EUC-JP になっています。

この table に
INSERT INTO maker(name) VALUES('任天堂');
INSERT INTO product(mid, name) VALUES (4, 'DS');
INSERT INTO product(mid, name) VALUES (4, 'Wii');
というデータを入れて、再度、http://xxx.xxx.xxx.xxx:8080/solr/dataimport?command=full-import にアクセスします。

実際に「任天堂」で検索できるか http://xxx.xxx.xxx.xxx:8080/solr/select/?q=%E4%BB%BB%E5%A4%A9%E5%A0%82 にアクセスしてみると、無事検索できていました。

おそらく、MySQL → Solr にデータを入れるときに EUC-JP → UTF-8 への変換がおこなわれているのだと思います。
この「EUC-JP」が EUC-JP-MS なのか CP51932 なのか EUC-JP なのかは調べる必要ありですが。。。
posted by おちエン at 01:20| Comment(0) | Solr | このブログの読者になる | 更新情報をチェックする

2010年06月14日

MySQL のデータを Solr にぶちこむ

MySQL などの RDB から Solr にデータを入れる方法について。

今回使用するデータベースは以下の DDL のものです。
CREATE DATABASE products;
GRANT ALTER,SELECT,INSERT,UPDATE,DELETE ON products.*
 TO user@localhost IDENTIFIED BY 'password';

CREATE TABLE maker (
  mid INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(16) NOT NULL
) TYPE=MyISAM;

CREATE TABLE product (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  mid INT UNSIGNED NOT NULL,
  name VARCHAR(16) NOT NULL
) TYPE=MyISAM;
まとめると、

データベース名products
ユーザ名user
パスワードpassword

で、テーブルは制約はつけていませんが、ER図を書くと以下のような感じ。

er.gif

データが入っていないと意味がないので、下記の SQL でデータを入れておきます。
INSERT INTO maker(name) VALUES('apple');
INSERT INTO maker(name) VALUES('SONY');
INSERT INTO maker(name) VALUES('MicroSoft');
INSERT INTO product(mid, name) VALUES (1, 'iPhone');
INSERT INTO product(mid, name) VALUES (1, 'iPod');
INSERT INTO product(mid, name) VALUES (1, 'iPad');
INSERT INTO product(mid, name) VALUES (2, 'PS3');
INSERT INTO product(mid, name) VALUES (3, 'WindowsXP');
INSERT INTO product(mid, name) VALUES (3, 'Windows2000');

いよいよ、solr の設定。
まず、schema.xml を編集します。ちなみに solr の schema.xml は以前と同じです。jetty/solr/conf/schema.xml の
  • <fields> 〜 </fields> までを削除
  • <copyField xxx> を削除
  • <defaultSearchField> 〜 </defaultSearchField>を削除
して、以下をコピーしてください。
<fields>
  <field name="id" type="string" indexed="true" stored="true" required="true" />
  <field name="name" type="text" indexed="true" stored="true" multiValued="false"/>
  <field name="product" type="text" indexed="true" stored="true" multiValued="true"/>
</fields>
<defaultSearchField>name</defaultSearchField>
Solr に MySQL のデータを入れるためには、DataImportHandler を使用しますが、以前の「Solr のディレクトリ構造」に書いたとおりの作業をしていた場合、DataImportHandler が使えない状態になっています。。。 DataImportHandler のソースは contrib ディレクトリにあるのですが、それをコピーしていないためです。。。
このままだと動かないため、apache-solr-dataimporthandler-1.4.0.jar を dist ディレクトリにコピーする必要があります。もしくは、contrib ディレクトリをコピーして、再度 make しても良いですが。
$ cp ~/setup/apache-solr-1.4.0/dist/apache-solr-dataimporthandler-1.4.0.jar dist/
また、MySQL の JDBC driver も必要です。MySQL のサイトからダウンロードして、mysql-connector-java-x.x.x-bin.jar を dist ディレクトリにコピーします。
$ cp somewhere/mysql-connector-java-5.0.8-bin.jar dist/
次に jetty/solr/conf/solrconfig.xml を編集します。編集箇所は2点。
  • dist ディレクトリの jar が読み込まれるようにする
  • DataImportHandler を登録する
dist ディレクトリの追加は、solrconfig.xml の上の方で
  <lib dir="../../dist/" />
<!--
  <lib dir="../../dist/" regex="apache-solr-cell-\d.*\.jar" />
  <lib dir="../../dist/" regex="apache-solr-clustering-\d.*\.jar" />
  <lib dir="../../dist/" regex="apache-solr-dataimporthandler-\d.*\.jar" />
-->
のような感じにします。DataImportHandler は適当な位置に、
 <requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
      <str name="config">data-config.xml</str>
  </lst>
</requestHandler>
を追加します。http://xxx.xxx.xxx.xxx:8080/solr/dataimport が呼ばれたら、org.apache.solr.handler.dataimport.DataImportHandler が呼び出されるというような感じです。

最後に jetty/solr/conf/data-config.xml を編集します。このファイルは 「DataImportHandler の登録」で指定した XML ファイルです。
このファイルにデータベースへの接続情報や MySQL → Solr のデータ受け渡しなどを記述します。

<dataConfig>
  <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:port/products"
     user="user" password="password"/>
  <document>
    <entity name="product" query="select * from product">
      <field column="id" name="id" />
      <field column="name" name="product" />

      <entity name="maker" query="select * from maker where mid = '${product.mid}'">
        <field column="name" name="name" />
      </entity>
    </entity>
  </document>
</dataConfig>
dataSource タグに DB への接続情報を記述します。
  • host名
  • port
  • データベース名
  • ユーザ名
  • パスワード
などを明記します。
次に MySQL → Solr のデータ受け渡し。Solr は RDB ではないので、リレーションは張れません。そこで entity タグを nest する必要がでてきます。ちなみに、テーブル1つ1つが entity タグになります。
上のdata-config.xml を説明すると、まず、"SELECT * FROM product" で product テーブルからデータを取り出し、その mid カラムのデータを元に maker テーブルを引き、maker.name を取り出しています。
MySQL → Solr の対応表は以下の通りです。
RDB のカラム名Solr のカラム名
product.idid
product.nameproduct
maker.namename


これで完成です。
solr を停止して、以前のデータが残ってるとうまくいったのかよくわからなくなりますので、jetty/solr/data/index を削除します。
$ cd jetty/solr/data
$ rm -rf index
jetty を起動して、http://xxx.xxx.xxx.xxx:8080/solr/dataimport?command=full-import にアクセスしてみてください。
<?xml version="1.0" encoding="UTF-8" ?> 
 <response>
  <lst name="responseHeader">
    <int name="status">0</int> 
    <int name="QTime">1</int> 
  </lst>
  <lst name="initArgs">
    <lst name="defaults">
      <str name="config">data-config.xml</str> 
    </lst>
  </lst>
  <str name="command">full-import</str> 
  <str name="status">busy</str> 
  <str name="importResponse">A command is still running...</str> 
  <lst name="statusMessages">
    <str name="Time Elapsed">0:0:1.20</str> 
    <str name="Total Requests made to DataSource">2</str> 
    <str name="Total Rows Fetched">2</str> 
    <str name="Total Documents Processed">0</str> 
    <str name="Total Documents Skipped">0</str> 
    <str name="Full Dump Started">2010-06-13 23:11:05</str> 
  </lst>
  <str name="WARNING">This response format is experimental. It is likely to change in the future.</str> 
 </response>
な感じで表示されれば OK です。

http://xxx.xxx.xxx.xxx:8080/solr/admin/stats.jsp にアクセスすれば、追加されたドキュメント数が表示されるはずです。

タグ:solr
posted by おちエン at 00:19| Comment(0) | Solr | このブログの読者になる | 更新情報をチェックする

2010年06月13日

Jetty の port を変更する

solr のデフォルトの port は 8983 になっています。今回はこの port を 8080 などに変更する方法について。

jetty の設定ファイルは、jetty/etc/jetty.xml なのでこれを変更します。
<Call name="addConnector">
  <Arg>
      <New class="org.mortbay.jetty.bio.SocketConnector">
        <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
        <Set name="maxIdleTime">50000</Set>
        <Set name="lowResourceMaxIdleTime">1500</Set>
      </New>
  </Arg>
</Call>
start.sh/stop.sh を作った人は、
$ cd jetty
$ ./stop.sh
$ ./start.sh
として、http://xxx.xxx.xxx.xxx:8080/solr/ にアクセスすれば、管理画面が表示されるはずです。

しかし、ドキュメントを追加するために、
$ cd jetty/exampledocs/
$ java -jar post.jar test.xml
とすると、
SimplePostTool: version 1.2
SimplePostTool: WARNING: Make sure your XML documents are encoded in UTF-8,
 other encodings are not currently supported
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file test.xml
SimplePostTool: FATAL: Connection error
 (is Solr running at http://localhost:8983/solr/update ?):
 java.net.ConnectException: Connection refused
などというエラーが表示されます。
原因は SimplePostTool に 8983 がハードコーディングされているせいです。
これをうまくやるためには、
$ java -Durl=http://localhost:8080/solr/update -jar post.jar test.xml
とすればよいのですが、-Durl が長すぎな感が。。。
そこで、SimplePostTool を書き換えて、port 指定できるようにします。



「SimplePostTool の変更」に続く
タグ:solr jety
posted by おちエン at 13:52| Comment(0) | Solr | このブログの読者になる | 更新情報をチェックする

solr の start/stop スクリプト

solr を起動するためには、
$ java -jar ./start.jar
というコマンドを打つ必要があり、止めるためには Ctrl-c で停止させるという原始的方法。
これはいけてないので、start および stop スクリプトを作成しようと思います。

まず、start.sh。
#!/bin/sh
JETTY_HOME_DIR=/usr/local/apache-solr-1.4.0/jetty

cd $JETTY_HOME_DIR
java -DSTOP.PORT=8090 -DSTOP.KEY=PASSOWRD -jar ./start.jar > /dev/null 2>&1 &
上記の PASSWORD というところは、適当な文字列に変更してください。
次に stop.sh。
#!/bin/sh

JETTY_HOME_DIR=/usr/local/apache-solr-1.4.0/jetty

cd $JETTY_HOME_DIR
java -DSTOP.PORT=8090 -DSTOP.KEY=PASSWORD -jar ./start.jar --stop
stop.sh の PASSWORD と start.sh の PASSWORD は同じ文字列である必要があります。
要は起動時にパスワードを与えて、そのパスワードが指定されないと停止できないということです。

$ chmod +x start.sh stop.sh
とすれば、start/stop スクリプトの完成です。

タグ:solr
posted by おちエン at 12:19| Comment(0) | Solr | このブログの読者になる | 更新情報をチェックする

Solr のディレクトリ構造

solr にはゼロから make できるようにソースファイルがついてきたり、サンプルを実行できるように jetty が同梱されてたりします。 それが原因でディレクトリ構造が複雑になっている気がします。
今回はこのディレクトリ構造を解明したいと思います。

solr は jetty で動かすという前提にすると、example というディレクトリ名が気に入らないのでこれを変更することにします。ただ、example ディレクトリはほとんど jetty に関連するファイルになっているため、example ディレクトリを jetty ディレクトリと名前を変えようと思います。
そうすると、make 前のディレクトリ構造は以下のようになります。

solr.gif

jetty ディレクトリより上のディレクトリは、solr を make するための Makefile (build.xml) やソース群です。 jetty ディレクトリ以下は、jetty に必要なファイル群で、jetty/solr ディレクトリが solr に必要なファイルになっています。
これだけたくさんファイルがある中で、solr のファイルというのは jetty/solr 以下にあるものだけです。

このディレクトリ構造にするためには、solr を展開したディレクトリを ~/setup/apache-solr-1.4.0 とし、移動先を /usr/local/apache-solr とすると、以下の一連のコマンドを実行してください。
$ mkdir /usr/local/apache-solr
$ cd /usr/local/apache-solr
$ cp ~/setup/apache-solr-1.4.0/build.xml .
$ cp ~/setup/apache-solr-1.4.0/common-build.xml .
$ cp -pr ~/setup/apache-solr-1.4.0/src .
$ cp -pr ~/setup/apache-solr-1.4.0/lib .
$ mkdir jetty
$ cd jetty/
$ cp -pr ~/setup/apache-solr-1.4.0/example/start.jar  .
$ cp -pr ~/setup/apache-solr-1.4.0/example/etc .
$ mkdir logs
$ cp -pr ~/setup/apache-solr-1.4.0/example/lib .
$ mkdir work
$ mkdir solr
$ cd solr/
$ cp -pr ~/setup/apache-solr-1.4.0/example/solr/conf .
$ mkdir data
solr の Makefile は example ディレクトリが変数ではなく、そのまま書かれてしまっているところがいくつかあるため、example → ${example} に書き換えます。具体的には以下の部分です。
  <target name="clean" depends="clean-contrib"
          description="Cleans compiled files and other temporary artifacts.">
    <delete dir="${dest}" />
    <delete dir="${dist}" />
    <delete dir="${example}/solr/lib" />
  </target>

  <!-- This depend on all of solr -->
  <path id="compile.classpath.solrj">
    <path refid="compile.classpath" />
    <pathelement location="${dest}/solrj"/>
    <!-- jetty -->
    <fileset dir="${example}/lib">
      <include name="**/*.jar" />
    </fileset>
  </path>

  <target name="run-example" depends="example">
    <property name="example.solr.home" location="${example}/solr"/>
    <property name="example.data.dir" location="${example}/solr/data"/>
さらに、common-build.xml の example 変数を書き換えます。
  <!-- Example directory -->
  <property name="example" value="${common.dir}/jetty" />
これで make できるようになりました。make は
$ ant example
でできます。make すると、/usr/local/apache-solr/jetty/webapps などのディレクトリが作成され、solr を実行できるようになります。

タグ:solr
posted by おちエン at 11:46| Comment(0) | Solr | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。