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なやりとりでデータを入れたり出したりが簡単にできます。