DRY

Web関連の技術の事、食事/お酒の事、旅行の事など

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

f:id:ke-16:20141030141204p:plain

Inquisitor Plugin (クエリのデバッグ)

plugin -install polyfractal/elasticsearch-inquisitor

http://localhost:9200/_plugin/inquisitor/#/

f:id:ke-16:20141030141018p:plain

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データベースサーバーからデータを取り込み

MySQLlocalhost
データベース名 = 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