よく使うElasticSearchのクエリ（ドキュメント操作）

ElasticSearchは、マニュアル（英語）がしっかりしてるので、そっちを参考にしてください。
マニュアル（本家）：https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

とりあえず、理解しやすく、MySQLのSQL文と比較しながら、まとめます。


## 環境

* CentOS 7.1
* ElasticSearch 5.6.2<br>
  ※ElasticSearch 6.xでは、curlに「 -H 'Content-Type: application/json'」を付ける必要があります。


## 目次

* [インデックス（マッピング）操作](https://qiita.com/nakazii-co-jp/items/0583ba7e90741939636a)
* ドキュメント（レコード）操作
* [データ取得](https://qiita.com/nakazii-co-jp/items/997a980f34bce5440628)
* [スナップショット](https://qiita.com/nakazii-co-jp/items/908b6a44e41f176abb8f)
* [elasticdump（インポート／エクスポート）](https://qiita.com/nakazii-co-jp/items/3199433d685d0600c6d6)


## ドキュメント（レコード）操作

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

### ■ _idを指定したときの登録方法

```bash:elasticsearchクエリ
curl -XPUT http://localhost:9200/hoge_index/hoge_type/2 -d '{
 "field_01": "hoge1",
 "field_02": "hoge2",
 "field_03": "hoge3"
}'
```

_id=2がデータの有無をチェックして、
データがなければMySQLでいうINSERT、データがあればMySQLでいうUPDATEを実行してくれる。

```mysql:MySQL（データがない場合）
INSERT INTO `hoge_index` . `hoge_type` (`_id`, `field_01`, `field_02`, `field_03`) 
VALUES (2, 'hoge1', 'hoge2', 'hoge3')
```

```mysql:MySQL（データがある場合）
UPDATE `hoge_index` . `hoge_type` SET 
  `field_01` = 'hoge1', 
  `field_02` = 'hoge2', 
  `field_03` = 'hoge3'
WHERE `_id` = 2
```


### ■ _idを指定しない登録方法

MySQLでいうところのauto_incrementのこと。

```bash:elasticsearch
curl -XPOST http://localhost:9200/hoge_index/hoge_type/ -d '{
 "field_01": "hoge1",
 "field_02": "hoge2",
 "field_03": "hoge3"
}'
```

```mysql:MySQL
INSERT INTO `hoge_index` . `hoge_type` (`field_01`, `field_02`, `field_03`) 
VALUES ('hoge1', 'hoge2', 'hoge3')
```

### ■ 一部のカラムを更新する方法

```bash:elasticsearch
curl -XPOST http://localhost:9200/hoge_index/hoge_type/2/_update -d '{
  "doc": {
    "field_01": "hoge1_upd"
  }
}'
```
```mysql:MySQL
UPDATE `hoge_index` . `hoge_type` SET 
  `field_01` = 'hoge1_upd'
WHERE `_id` = 2
```

### ■ 条件を指定してデータを一括更新
※タイプは「hoge_type」とする。

```bash:elasticsearch
curl -XPOST 'http://localhost:9200/hoge_index/_update_by_query?conflicts=proceed&pretty' -d '{
  "query": {
    "term": {
      "field_03": {
        "value": "hoge3"
      }
    }
  },
  "script": {
    "inline": "ctx._source.field_01 = \"Hoge hoge\""
  }
}'
```

```mysql:MySQL
UPDATE `hoge_index` . `hoge_type` SET
  `field_01` = 'Hoge hoge'
WHERE 
  `field_03` = 'hoge3'
```


### ■ 別のカラムの値に一括更新
※タイプは「hoge_type」とする。

```bash:elasticsearch
curl -XPOST 'http://localhost:9200/hoge_index/_update_by_query?conflicts=proceed&pretty' -d '{
  "query": {
    "term": {
      "field_03": {
        "value": "hoge3"
      }
    }
  },
  "script": {
    "inline": "ctx._source.field_02 = ctx._source.field_01"
  }
}'
```

```mysql:MySQL
UPDATE `hoge_index` . `hoge_type` SET
  `field_02` = `field_01`
WHERE 
  `field_03` = 'hoge3'
```


### ■ 条件を指定しないでデータを一括更新
※タイプは「hoge_type」とする。

```bash:elasticsearch
curl -XPOST 'http://localhost:9200/hoge_index/_update_by_query?conflicts=proceed&pretty' -d '{
  "query": {
    "match_all": { }
  },
  "script": {
    "inline": "ctx._source.field_01 = \"Hoge\"; ctx._source.field_02 = \"\";"
  }
}'
```

```mysql:MySQL
UPDATE `hoge_index` . `hoge_type` SET
  `field_01` = 'Hoge', 
  `field_02` = ''
```


### ■ 条件を指定してデータを一括削除
※タイプは「hoge_type」とする。

```bash:elasticsearch
curl -XPOST 'http://localhost:9200/hoge_index/_delete_by_query?conflicts=proceed&pretty' -d '{
  "query": {
    "term": {
      "field_03": {
        "value": "hoge3"
      }
    }
  }
}'
```

```mysql:MySQL
DELETE FROM `hoge_index` . `hoge_type`
WHERE 
  `field_03` = 'hoge3'
```


### ■ 条件を指定しないでデータを一括更新
※タイプは「hoge_type」とする。

```bash:elasticsearch
curl -XPOST 'http://localhost:9200/hoge_index/_delete_by_query?conflicts=proceed&pretty' -d '{
  "query": {
    "match_all": { }
  }
}'
```

```mysql:MySQL
DELETE FROM `hoge_index` . `hoge_type`

or 

TRUNCATE `hoge_index` . `hoge_type`
```


## 参考
 * [elasticsearch-php documents](https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html)
 * http://qiita.com/4cteru/items/074d8dc956103c36b7fa (bulkについて)
 * https://qiita.com/kieaiaarh/items/5ea4e8a188bd9814000d (SQLと対比)