Elasticsearch とかのまとめ

# Elasticsearch  まとめ 
## はじめに
ただのまとめ。（自分用）
結局まとめないとわかんない。
かぶっていてもその時の自分の環境でやるなら、自分で書いてまとめるのがベストだと信じてる。

- 知りたいこと<br />検索とか そのあたり

## 環境
- macOS High Sierra
- Docker 19.03.5
- docker-compose 1.25.0 
- Elasticsearch v6.8.3

## データ
適当にいれた。

## 本題
- 全検索

```
GET _search
{
  "query": {
    "match_all": {}
  }
}
```

- indexを絞って検索

```
GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match_all": {}
  }
}
```

- mappling

```
GET /library/_mappings
```

- フィールドの値一覧（keyword）

```
GET /library/_search
{
  "size":0,
  "aggs": {
    "genre": {
      "terms": {"field":"class.keyword"}
    }
  }
}
```
※type=keywordでなければ、キーワードつけないが数値は列挙する必要なさそう。

Response

```
{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 7,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "genre" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "DVD",
          "doc_count" : 3
        },
        {
          "key" : "book",
          "doc_count" : 2
        },
        {
          "key" : "CD",
          "doc_count" : 1
        }
      ]
    }
  }
}
```
当然値がないのは無視される。

- フィールドの値集計（最大・最小・平均）

```
GET /library/_search
{
  "size": 0,
  "query": {
    "match": {
      "class": "DVD"
    }
  },
  "aggs": {
    "max_price": {
      "max": {
        "field": "price"
      }
    },
    "min_price": {
      "min": {
        "field": "price"
      }
    },
    "average": {
      "avg": {
        "field": "price"
      }
    }
  }
}
```

Response

```
{
  "took" : 33,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 6,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "average" : {
      "value" : 71.94999885559082
    },
    "max_price" : {
      "value" : 125.94999694824219
    },
    "min_price" : {
      "value" : 17.950000762939453
    }
  }
}

```


- 絞り込んだキーの一覧

```
GET /library/_search
{
  "size":0,
  "query": {
    "match": {
      "class": "DVD"
    }
  }, 
  "aggs": {
    "genre": {
      "terms": {"field":"sub_class.keyword"
      }
    }
  }
}
```

Response

```
{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 6,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "genre" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "animation",
          "doc_count" : 2
        },
        {
          "key" : "movie",
          "doc_count" : 1
        }
      ]
    }
  }
}

```

- and検索

```
GET /library/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "class": "DVD"
          }
        },
        {
          "match": {
            "sub_class": "animation"
          }
        }
      ]
    }
  }
}
```

# 参考
https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329#mapping
https://medium.com/eureka-engineering/基礎編-elasticsearchの検索クエリを使いこなそう-ace3e18c2174
https://itdepends.hateblo.jp/entry/2018/11/16/003706