Elasticsearchを使ってみる


Elasticsearchは、REST APIでデータ(ドキュメント)の登録や、検索を行うことができるらしい。

とりあえず、GitHubにあるREADMEの内容をやってみる。

## 環境

Mac OS X 10.9


## ダウンロード

http://www.elasticsearch.org/download

今回は、0.90.10 を使う

## 起動

```bash:run
./bin/elasticsearch -f
```


## 確認

```bash:check
curl -X GET http://localhost:9200/
```

起動しているようだ。


## インデックス

Twitterっぽいデータを入れて検索してみる。
twitterインデックスは自動的に作成されるようだ。

### ユーザの作成

```bash
curl -XPUT 'http://localhost:9200/twitter/user/kimchy' -d '{ "name" : "Shay Banon" }'
```

### Tweetデータの登録

```bash
curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T13:12:00", 
    "message": "Trying out Elasticsearch, so far so good?" 
}'

curl -XPUT 'http://localhost:9200/twitter/tweet/2' -d '
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T14:12:12", 
    "message": "Another tweet, will it be indexed?" 
}'
```


### 登録したデータを取得してみる

```
curl -XGET 'http://localhost:9200/twitter/user/kimchy?pretty=true'
{
  "_index" : "twitter",
  "_type" : "user",
  "_id" : "kimchy",
  "_version" : 1,
  "exists" : true, "_source" : { "name" : "Shay Banon" }
}
```

```
curl -XGET 'http://localhost:9200/twitter/tweet/1?pretty=true'
```

```json
{
  "_source": {
    "message": "Trying out Elasticsearch, so far so good?",
    "postDate": "2009-11-15T13:12:00",
    "user": "kimchy"
  },
  "exists": true,
  "_version": 1,
  "_id": "1",
  "_type": "tweet",
  "_index": "twitter"
}
```


## 検索

```bash
curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy&pretty=true'
```

```json
{
  "hits": {
    "hits": [
      {
        "_source": {
          "message": "Another tweet, will it be indexed?",
          "postDate": "2009-11-15T14:12:12",
          "user": "kimchy"
        },
        "_score": 1,
        "_id": "2",
        "_type": "tweet",
        "_index": "twitter"
      },
      {
        "_source": {
          "message": "Trying out Elasticsearch, so far so good?",
          "postDate": "2009-11-15T13:12:00",
          "user": "kimchy"
        },
        "_score": 0.30685282,
        "_id": "1",
        "_type": "tweet",
        "_index": "twitter"
      }
    ],
    "max_score": 1,
    "total": 2
  },
  "_shards": {
    "failed": 0,
    "successful": 5,
    "total": 5
  },
  "timed_out": false,
  "took": 3
}
```


### クエリ文字列の変りに、JSONクエリ言語を使うことができる

```bash
curl -XGET 'http://localhost:9200/twitter/tweet/_search?pretty=true' -d '
{ 
    "query" : { 
        "text" : { "user": "kimchy" }
    } 
}'
```


### 全てのデータを取得

```bash
curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -d '
{ 
    "query" : { 
        "matchAll" : {} 
    } 
}'
```


### 期間指定でのデータ取得

postDataの、fromとtoを指定する。

```bash
curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -d '
{ 
    "query" : { 
        "range" : { 
            "postDate" : { "from" : "2009-11-15T13:00:00", "to" : "2009-11-15T14:00:00" } 
        } 
    } 
}'
```

Lucene互換のクエリが使用可能とのこと。

## マルチテナント

Elasticsearchは、複数のインデックスをサポートしている。
Twitter全体ではインデックスが大きくなりすぎるので、ユーザ毎にインデックスを分割する。


```bash
curl -XPUT 'http://localhost:9200/kimchy/info/1' -d '{ "name" : "Shay Banon" }'

curl -XPUT 'http://localhost:9200/kimchy/tweet/1' -d '
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T13:12:00", 
    "message": "Trying out Elasticsearch, so far so good?" 
}'

curl -XPUT 'http://localhost:9200/kimchy/tweet/2' -d '
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T14:12:12", 
    "message": "Another tweet, will it be indexed?" 
}'
```

上記の例では、infoとtweetに分割されている。

### シャードとレプリカ

インデックスレベルの完全な制御を行うことができる。
この例では、インデックス毎に、1シャードと1レプリカとなっている。

```
curl -XPUT http://localhost:9200/another_user/ -d '
{ 
    "index" : { 
        "numberOfShards" : 1, 
        "numberOfReplicas" : 1 
    } 
}'
```

### 複数インデックスにまたがる検索

```bash
curl -XGET 'http://localhost:9200/kimchy,another_user/_search?pretty=true' -d '
{ 
    "query" : { 
        "matchAll" : {} 
    } 
}'
```

もしくは、全てのインデックス

```bash
curl -XGET 'http://localhost:9200/_search?pretty=true' -d '
{ 
    "query" : { 
        "matchAll" : {} 
    } 
}'
```