MacでElasticSearchをインストールしてMySQLのデータを日本語検索する
ElasticSearch本体のインストール
brew install elasticsearch
Plugin関連
Elasticsearch Head (クラスタ管理)
plugin -install mobz/elasticsearch-head
Marvel (クラスタモニタリングツール)
plugin -install elasticsearch/marvel/latest
http://localhost:9200/_plugin/marvel
Inquisitor Plugin (クエリのデバッグ)
plugin -install polyfractal/elasticsearch-inquisitor
http://localhost:9200/_plugin/inquisitor/#/
Kuromoji (日本語形態素解析エンジン)
plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.3.0
今回のメインの目的でもあるKuromojiのインストール
GitHubのページを見ると es-1.3系は Kuromoji2.3.0のようなので2.3.0をインストール
jdbc-connecterのインストール(この時の最新版5.1.33)
ダウンロードしてお好きな位置に配置
/Users/user_name/mysql-connector-java-5.1.33 に($HOME以下)配置
vi ~/.bashrc # 追記 export CLASSPATH=$CLASSPATH:/Users/user_name/mysql-connector-java-5.1.33/mysql-connector-java-5.1.33-bin.jar source ~/.bashrc
River (MySQLからデータを取り込み)
plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/plugin/elasticsearch-river-jdbc/1.3.4.4/elasticsearch-river-jdbc-1.3.4.4-plugin.zip
GitHubのReadmeにてmysql-connector-java-5.1.33-bin.jarをコピーする必要があるとの記載があるので、インストールディレクトリを確認する
>-> Installing jdbc... >Trying http://xbib.org/repository/org/xbib/elasticsearch/plugin/elasticsearch-river-jdbc/1.3.4.4/elasticsearch-river-jdbc-1.3.4.4-plugin.zip... >Downloading .........................................................DONE >Installed jdbc into /usr/local/var/lib/elasticsearch/plugins/jdbc
MySQL JDBC driver を $ES_HOME/plugins/jdbc/ にコピー
cp /Users/user_name/mysql-connector-java-5.1.33/mysql-connector-java-5.1.33-bin.jar /usr/local/var/lib/elasticsearch/plugins/jdbc
これでPlugin関連のインストールはOKなので
ElasticSearchの起動
$ elasticsearch
動作確認
Test indexの作成
curl -XPUT 'http://localhost:9200/test/'
戻り値
{"acknowledged":true}
defaultのanalyzerで検証
curl -XGET 'http://localhost:9200/test/_analyze?pretty=true' -d '東京都渋谷区'
戻り値
"tokens" : [ { "token" : "東", "start_offset" : 0, "end_offset" : 1, "type" : "<IDEOGRAPHIC>", "position" : 1 }, { "token" : "京", "start_offset" : 1, "end_offset" : 2, "type" : "<IDEOGRAPHIC>", "position" : 2 }, { "token" : "都", "start_offset" : 2, "end_offset" : 3, "type" : "<IDEOGRAPHIC>", "position" : 3 }, { "token" : "渋", "start_offset" : 3, "end_offset" : 4, "type" : "<IDEOGRAPHIC>", "position" : 4 }, { "token" : "谷", "start_offset" : 4, "end_offset" : 5, "type" : "<IDEOGRAPHIC>", "position" : 5 }, { "token" : "区", "start_offset" : 5, "end_offset" : 6, "type" : "<IDEOGRAPHIC>", "position" : 6 } ] }
Kuromojiのanalyzerで検証
curl -XGET 'http://localhost:9200/test/_analyze?pretty=true&analyzer=kuromoji' -d '東京都渋谷区'
戻り値
$ curl -XGET 'http://localhost:9200/test/_analyze?pretty=true&analyzer=kuromoji' -d '東京都目黒区' { "tokens" : [ { "token" : "東京", "start_offset" : 0, "end_offset" : 2, "type" : "word", "position" : 1 }, { "token" : "都", "start_offset" : 2, "end_offset" : 3, "type" : "word", "position" : 2 }, { "token" : "渋谷", "start_offset" : 3, "end_offset" : 5, "type" : "word", "position" : 3 }, { "token" : "区", "start_offset" : 5, "end_offset" : 6, "type" : "word", "position" : 4 } ] }
問題無く動作しているのでIndexの削除
curl -XDELETE 'http://localhost:9200/test'
戻り値
{"acknowledged":true}
最後にMySQLからデータの流し込み
ElasticSearch 側に kuromoji を使った検索インデックスを作成
curl -XPUT http://localhost:9200/test_kuromoji -d '{ "index": { "analysis": { "tokenizer": { "kuromoji_user_dict" : { "type":"kuromoji_tokenizer" } }, "analyzer": { "analyzer": { "type":"custom", "tokenizer": "kuromoji_user_dict" }}}}}'
Riverを使って、作成したインデックス(test_kuromoji)に MySQLデータベースサーバーからデータを取り込み
MySQLは
localhost
データベース名 = elasticsearchtest
test_table からデータを流し込む想定
curl -XPUT http://localhost:9200/_river/my_jdbc_river/_meta -d '{ "type": "jdbc", "jdbc": { "url": "jdbc:mysql://localhost/elasticsearchtest", "user": "root", "password": "password", "sql": "select * from test_table", "index": "test_kuromoji", "type": "test" }}'
最後にnameフィールドから"test"で検索してみる
curl -XPOST http://localhost:9200/test_kuromoji/_search?pretty -d '{ "query": { "query_string": { "query": "name:テスト" } } }'
例えばidフィールドのみ取りたい場合
curl -XPOST http://localhost:9200/test_kuromoji/_search?pretty -d '{ "query": { "match": { "name": "テスト"}}, fields: ["id"] }'
例えばさらにcreatedでソートして取りたい場合
curl -XPOST http://localhost:9200/test_kuromoji/_search?pretty -d '{ "query": { "match": { "name": "テスト"}}, fields: ["id"], sort: [{created: {order: "desc"}}] }'
MySQLのFULLTEXTINDEXより、メチャクチャ速くなっていいのですがフロントのWebで検索エンジンとして使いたかったら、ページャー自作するしかないんですかね? 今時ページャー自作ってなーと。。。
参考サイト
http://dotnsf.blog.jp/archives/1005246681.html http://dotnsf.blog.jp/archives/1005213909.html http://tech.gmo-media.jp/post/70245090007/elasticsearch-kuromoji-japanese-fulltext-search http://qiita.com/yutori_enginner/items/bec071b2d9278f1b7e8f
各種ライブラリリンク先
http://www.elasticsearch.org/overview/elkdownloads/ http://xbib.org/repository/org/xbib/elasticsearch/plugin/elasticsearch-river-jdbc/ https://github.com/elasticsearch/elasticsearch-analysis-kuromoji