よく使う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/d8dca15e5eab6406ffdb)
* データ取得
* [スナップショット](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

タイプだけを削除することができないので、ElasticSearchとしては、インデックスとタイプは1対1にする方が良い（？）。
基本、クエリを投げるときは、タイプを省略する。

※下記のクエリについては、タイプを「hoge_type」とする。

### ■ Bool Queryについて

Elasticsearch 2.0からandクエリとorクエリは全部非推奨になり、その代わりに[boolクエリ](https://www.elastic.co/guide/en/elasticsearch/reference/2.0/query-dsl-bool-query.html)の方が推奨されます。Boolクエリは複数のクエリを組み合わせる（つまりAND、OR、NOTで結合）のに使います。

クエリ| 説明
----- | ---------------------------------------------------
must  | ANDとして使います。小クエリは総合スコアに影響を与えます。
filter | mustと同じくANDです。ただし、スコアは無視されます（総合スコアに影響を与えません）。
should | ORとして使えます。 minimum_should_matchパラメータで最低マッチする条項の数が指定できます。
must_not | NOTです。

### ■ レスポンスの体裁を整える

通常、レスポンスは、inlineのJSONで出力されるが、prettyパラメータを付けると、体裁を整えて出力される。

* prettyパラメータを付けない場合

```bash:elasticsearch
$ curl -XGET http://localhost:9200/hoge_index/_search
{"took":0,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
```

* prettyパラメータを付けた場合

```bash:elasticsearch
$ curl -XGET http://localhost:9200/hoge_index/_search?pretty
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

```



### ■ 条件指定しないでデータ取得
全件取得するが、デフォルト30件しかとってこない。

```bash:elasticsearch
curl -XGET http://localhost:9200/hoge_index/_search
```

```mysql:MySQL
SELECT * FROM `hoge_index` . `hoge_type`
```


### ■ 開始位置(offset)と取得件数(limit)の指定

```bash:elasticsearch
curl -XGET http://localhost:9200/hoge_index/_search?from=5&size=1
```

```mysql:MySQL
SELECT * FROM `hoge_index` . `hoge_type`
LIMIT 5, 1, 
```


### ■ ランダムで取得する

```bash:elasticsearch
curl -XGET 'http://localhost:9200/hoge_index/_search?size=1' -d '{
  "query": {
    "function_score" : {
      "query" : { 
        "match_all": {}
      },
      "random_score" : {}
    }
  }
}'
```

```mysql:MySQL
SELECT * FROM `hoge_index` . `hoge_type`
ORDER BY rand()
LIMIT 0, 1, 
```



### ■ 複雑な条件を指定してデータ取得（その１）

ごめんなさい。あとで記述します。

```bash:elasticsearch

```

```mysql:MySQL

```



## 参考
 * [elasticsearch-php documents](https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html)
 * https://developers.eure.jp/tech/elasticsearch_search_query/ (search query)
 * http://qiita.com/jtodo/items/be053be4aa704e6c57d0 (複雑なsearch query)
 * http://qiita.com/vanhuyz/items/04a6871ae5f53ba5a97f (複雑なsearch query)
 * http://qiita.com/jtodo/items/be053be4aa704e6c57d0 (Group By)
 * https://qiita.com/kieaiaarh/items/5ea4e8a188bd9814000d (SQLと対比)
 * http://x1.inkenkun.com/archives/487
 * https://qiita.com/vanhuyz/items/04a6871ae5f53ba5a97f (bool queryについて)