- 更新日: 2014年5月19日
- Elasticsearch
ElasticsearchにMySQLからデータ挿入、JDBC River Pluginのインストールと使い方
MySQL から Elasticsearch へデータ取り込みを行う JDBC River Plugin をインストールします。以下エントリーの続きとなります。
ElasticsearchのインストールとCSVからのデータ挿入 | EasyRamble
Elasticsearchのクエリとフィルターで簡単な検索を試す例 | EasyRamble
— 環境 —
Mac OS X Lion 10.7.5
JDBC driver for MySQL のダウンロード
JDBC River Plugin の動作には、Java から MySQL への接続するための JDBC driver が必要なので、あらかじめ利用するDBベンダーの JDBC driver をダウンロードしておきます。私は、MySQL 利用なので以下のページからダウンロードしました。
ダウンロードしたら解凍して、.jar ファイルを /usr/share/java/ に移動します。
1 2 3 4 5 6 |
$ cd ~/Downloads $ tar xvfz mysql-connector-java-5.1.30.tar.gz $ cd mysql-connector-java-5.1.30 $ sudo mv mysql-connector-java-5.1.30-bin.jar /usr/share/java |
その後、MySQL JDBC driver へのパスを CLASSPATH 環境変数に追加。
1 2 3 4 5 |
$ vi ~/.zshrc # MySQL JDBC driver export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.30-bin.jar |
変更を反映させる。
1 2 3 |
$ source ~/.zshrc |
Java から MySQL への接続確認
テスト用の sample データベースを作成しておきます。
1 2 3 4 |
$ mysql -u root -p mysql> create database sample; |
Java から MySQL への接続を確認するために簡単な Java プログラムを作成します。説明のないとってもシンプルなサンプルプログラム集 からお借りしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$ cd ~/work $ vi mysql.java import java.io.*; import java.net.*; import java.sql.*; class Test{ public static void main(String args[]){ try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/sample","root","12345678"); Statement st = con.createStatement(); st.executeUpdate("CREATE TABLE mytbl (id INT,name VARCHAR(10))"); st.executeUpdate("INSERT INTO mytbl (id,name) VALUES (1,'apple')"); st.executeUpdate("INSERT INTO mytbl (id,name) VALUES (2,'banana')"); st.executeUpdate("INSERT INTO mytbl (id,name) VALUES (3,'candy')"); ResultSet rs = st.executeQuery("SELECT id,name FROM mytbl"); while(rs.next()){ System.out.println(rs.getString("id") +" "+ rs.getString("name")); } st.executeUpdate("DROP TABLE mytbl"); con.close(); } catch (Exception e) { System.out.println("ERROR:" + e ); } } } |
12345678 の部分は、MySQL の root ユーザーのパスワードに変更します。あとは、コンパイルして実行。
1 2 3 4 5 6 7 |
$ javac mysql.java $ java Test 1 apple 2 banana 3 candy |
無事に、MySQL への接続を確認できました。これで準備OK。
JDBC River Plugin をインストール
ここからが本番ですが、MySQL 内のデータを Elasticsearch にインデックスさせるために、Elasticsearch のプラグインである JDBC River Plugin をインストールします。様々な River Plugin が用意されているので、SQL 以外のデータ形式からも色々 Elasticsearch に取り込めるようです。
https://github.com/jprante/elasticsearch-river-jdbc
JDBC River Plugin をインストール。
1 2 3 |
$ plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/plugin/elasticsearch-river-jdbc/1.1.0.1/elasticsearch-river-jdbc-1.1.0.1-plugin.zip |
Github の readme にある通りに、MySQL JDBC driver を $ES_HOME/plugins/jdbc/ にコピーします。$ES_HOME がどこか分からなかったので、まずは plugins のディレクトリを調べました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ brew info elasticsearch elasticsearch: stable 1.1.1, HEAD http://www.elasticsearch.org /usr/local/Cellar/elasticsearch/1.1.1 (43 files, 22M) * Built from source From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/elasticsearch.rb ==> Caveats Data: /usr/local/var/elasticsearch/elasticsearch_*****/ Logs: /usr/local/var/log/elasticsearch/elasticsearch_*****.log Plugins: /usr/local/var/lib/elasticsearch/plugins/ ... |
driver をコピー。
1 2 3 |
$ cp /usr/share/java/mysql-connector-java-5.1.30-bin.jar /usr/local/var/lib/elasticsearch/plugins/jdbc |
MySQL にテスト用テーブルとデータを用意して試す
テスト用の MySQL データとして以下を用意しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mysql> create table test(id integer, name varchar(20)); mysql> insert into test (id, name) values (1, "りんご"); mysql> insert into test (id, name) values (2, "リンゴ"); mysql> insert into test (id, name) values (3, "林檎"); mysql> insert into test (id, name) values (4, "apple"); mysql> select * from test; +------+-----------+ | id | name | +------+-----------+ | 1 | りんご | | 2 | リンゴ | | 3 | 林檎 | | 4 | apple | +------+-----------+ 4 rows in set (0.00 sec) |
このデータを Elasticsearch に取り込んでみます。
1 2 3 4 5 6 7 8 9 10 11 |
$ curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{ "type" : "jdbc", "jdbc" : { "url" : "jdbc:mysql://localhost:3306/sample", "user" : "root", "password" : "*****", "sql" : "select * from test" } }' |
elasticsearch を再起動。http://127.0.0.1:9200/_plugin/head/ にアクセスすると、MySQL からデータが取り込まれたのを確認できました。しかも CSV River の時と違って、JDBC River では日本語が文字化けせずに正常にインポートできています!
以上の方法では事前に Elasticsearch で mapping を作成せずに、MySQL → Elasticsearch へと直接データを入れたので、Elasticsearch のフィールドの型などは動的に決定されることになります。head プラグインで動的に作成された mappings を確認すると以下のように、id は long 型、name は sgring 型になっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mappings: { jdbc: { properties: { id: { type: long } name: { type: string } } } } |
mapping が動的に作成されるのは若干怖い感じがしますので、以降では、事前に mapping を作成してその後 JDBC River プラグインを使う方法を紹介します。
事前に mapping を作成して MySQL からインポート
次に、Elasticsearch 側で事前に以下の mapping を作成してデータのインポートを試してみます。index 名は sample。type 名は test。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
$ curl -XPOST localhost:9200/sample -d ' { "settings": { "analysis": { "tokenizer": { "ngram_tokenizer": { "type": "nGram", "min_gram": "2", "max_gram": "3", "token_chars": [ "letter", "digit" ] } }, "analyzer": { "ngram_analyzer": { "tokenizer": "ngram_tokenizer" } } } }, "mappings": { "test": { "_source": { "enabled": true }, "_all": { "enabled": true, "analyzer": "ngram_analyzer" }, "properties": { "id": { "type": "integer", "index": "not_analyzed" }, "name": { "type": "string", "index": "analyzed", "analyzer": "ngram_analyzer" } } } } }' {"acknowledged":true}% |
この作成した index/type => sample/test に MySQL からデータを取り込んでみます。jdbc プロパティで、index に sample、type に test を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{ "type" : "jdbc", "jdbc" : { "url" : "jdbc:mysql://localhost:3306/sample", "user" : "root", "password" : "*****", "sql" : "select * from test", "index" : "sample", "type" : "test" } }' |
http://127.0.0.1:9200/_plugin/head/ で確認すると、sample/test にデータが無事に取り込まれました。このように先に mapping を定義し index/type を作成した後に、JDBC River で index/type を指定してデータをインポートしてやるとフィールドの型を独自に自由に決められます。個人的にはこちらの方法のほうが安心です。
JDBC River Plugin を用いた MySQL から Elasticsearch へのデータ取り込みは以上です。
- – 参考リンク –
- Moving a table into Elasticsearch
- Labeled columns
- Javaからデータベースアクセスする方法 (MySQL)
- 説明のないとってもシンプルなサンプルプログラム集
- Directory Layout
- Elasticsearch の関連記事
- CentOS6にElasticsearchをインストールしMySQLからデータをインポート
- Rails で jQuery を使って Elasticsearch 全文検索による検索文字をハイライトさせる
- elasticsearch-ruby でトークナイザーを指定してトークン分割
- elasticsearch-ruby で外部入力から検索時の json 用文字列のエスケープ処理
- Elasticsearch を Ruby から使う
- Elasticsearchのクエリとフィルターで簡単な検索を試す例
- ElasticsearchのインストールとCSVからのデータ挿入
Leave Your Message!