Elasticsearch導入後に入れておきたいプラグイン

Elasticsearchを導入後に入れておきたいプラグインを上げておきます。いろいろとあると思うけど、私の場合は以下を入れておく感じかな。pluginコマンドでインストールしますが、rpmで入れると、/usr/share/elasticsearch以下に入るので、環境に合わせて呼んでください。
まず、elasticsearch-headプラグイン。クラスタやインデックスの状態が簡単にみられます。個人的には必須な感じです。

# /usr/share/elasticsearch/bin/plugin -install mobz/elasticsearch-head

次にBigdeskプラグイン。JVMとかインデックスへのアクセスとか状態をグラフ化してくれます。

# /usr/share/elasticsearch/bin/plugin -install lukas-vlcek/bigdesk

あとは、日本語の形態素解析のトークンナイザのkuromoji。形態素解析をしたいときに入れておきます。まぁ、これは必要に応じてかと。

# /usr/share/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/1.5.0

という感じで、上記以外にも良い物があればその時にでも紹介しますー。

Elasticsearchのインストール

Elasticsearchを結構使っているもののまとめたことはなかったので、インストールについての紹介です。ElasticsearchはRESTfulな分散検索&分析システムです。といってもわかりにくいので、もっと簡単にいうとRESTfulな感じでJSONでデータを追加、更新、削除、検索ができるシステムです。Luceneベースなので検索の印象が強くなりますが、DBのようなトランザクション処理の信頼性とか厳密に考えなければデータストアとしても使えるかと。あとは、クラスタを簡単に組むことができます。このクラスタの組みやすさとかもウリな気がします。
今回は、CentOS 6にインストールします。インストールはrpmが提供されているので、簡単です。

# rpm -ivh elasticsearch-0.90.7.noarch.rpm

あとは、/etc/elasticsearch/elasticsearch.ymlを編集します。まず、cluster.nameを適当なものに変えます。これを変えておかないとどこかと自動でクラスタされたりします。

cluster.name: elasticsearch-test

あと、いろいろとパラメータはありますが、特にクラスタを組まなければ以下でも良いと思います。

index.number_of_shards: 1
index.number_of_replicas: 0

その他のパラメータはググって調べるのが良いと思います。現時点では、結構、Elasticsearchのサイトのドキュメントの中から情報を見つけるのは難しいと思います(たぶん、ソースがドキュメントだ的な人はソースを見るのが良いです)。という感じで、あとは起動するだけです。

/etc/init.d/elasticsearch start

そして、とりあえず、アクセスすると

$ curl -XGET localhost:9200
{
  "ok" : true,
  "status" : 200,
  "name" : "Stranger",
  "version" : {
    "number" : "0.90.7",
    "build_hash" : "36897d07dadcb70886db7f149e645ed3d44eb5f1",
    "build_timestamp" : "2013-11-13T12:06:54Z",
    "build_snapshot" : false,
    "lucene_version" : "4.5.1"
  },
  "tagline" : "You Know, for Search"
}

という感じでJSONで返ってくると思います。
RESTfulなので、HTTPメソッドで処理が変わりますが、データを追加してみます。

$ curl -XPUT localhost:9200/aaa/bbb/1 -d '{"message":"This is a pen."}'
{"ok":true,"_index":"aaa","_type":"bbb","_id":"1","_version":1}

ここで/aaa/bbbとなっていますが、aaaの部分がインデックス名でbbbの部分がタイプ名になります。インデックス名はその名前のままですが、タイプ名はインデックスの中で種類分けとかしたいときに使う感じかと思いますが、何か適当に決めて使ってください。あとは、追加するデータのIDを指定します。ここでは1としましたが、なければ勝手につけてくれます。そして、GETで取得すれば得られます。

$ curl -XGET localhost:9200/aaa/bbb/1?pretty=true
{
  "_index" : "aaa",
  "_type" : "bbb",
  "_id" : "1",
  "_version" : 1,
  "exists" : true, "_source" : {"message":"This is a pen."}
}

pretty=trueをつけるとレスポンスがきれいにフォーマットされます。検索する場合は、/_searchをつけます。

$ curl -XGET localhost:9200/aaa/bbb/_search?pretty=true
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "aaa",
      "_type" : "bbb",
      "_id" : "1",
      "_score" : 1.0, "_source" : {"message":"This is a pen."}
    } ]
  }
}

削除はDELETEメソッドで呼び出します。

$ curl -XDELETE localhost:9200/aaa/bbb/1
{"ok":true,"found":true,"_index":"aaa","_type":"bbb","_id":"1","_version":2}

というような感じで、JSONでRESTfulなやりとりでデータを入れたり出したりが簡単にできます。

Elasticsearch Authプラグイン

Authプラグインをリリースしました。Maven Centralに置いてあるので簡単にElasticsearchにインストールできるかと。まぁ、このプラグインを簡単に言うと、アクセス制御してくれます。Elasticsearch自体を直接外部にさらすことはないと思いますが、内部で使うにしてもすべてのリクエストを受け付けてもらっても困るとか、クラスタのシャットダウンを有効にしたいけど、気軽にcurlで叩かれてもねーとか言うときにアクセス制御すれば良いかと思います。実装的には、サーブレットで言うサーブレットフィルタ的なところでチェックしているので、アクセスの早い段階でチェックがかかります(Elasticsearchでこの辺の実装方法的なドキュメントは見たことはないですがソース的にはRestActionへのフィルタが可能だったのでそれで実装)。という感じで、リリースしましたが何かありましたらお知らせくださいー。