Elasticsearchはじめる

# elasticsearchについて
## 概要
elasticsearchとは、[1]<br>
> - Elastic社が開発している、スケーラビリティに優れた全文検索エンジン
- リアルタイムデータ分析、ログ解析、全文検索など様々な分析が可能になる
- ログ集約のLogstashやfluentd、可視化ツールのkibanaと一緒に使われることが多い。また、日本語用に日本語形態素解析エンジンの kuromojiを導入して使われる。
- 複数のデータベースを横断して検索することが、ごく当たり前の用途として提供されている

## 動作環境
- elasticsearch: 6.7.1
- kinaba: 6.7.1

## 始め方
導入の仕方は２種類。
### 1. homebrewからインストール
1. `brew install elasticsearch`<br>
次にpluginを入れる。使いたいanalyzerに応じて異なるが、日本語の場合__kuromoji__を使うことが多い。
2. `/bin/elasticsearch-plugin install analysis-kuromoji`

### 2. dockerを使う(推奨)[2]
elasticsearchは通常、__kibana__ というアプリケーションを用いて分析やデータの可視化をするためdocker-composeで同時にインストールしたほうが楽。また、ホストの環境に影響しにくいのもポイント。

#### ファイル構造
```
|--- docker-compose.yml
|--- es
|    |--- Dockerfile
|
|---kibana
     |--- Dockerfile
```

#### docker-compose.yml
```
version: '2'
services:
  elasticsearch:
    build: es
    volumes:
        - es-data:/usr/share/elasticsearch/data
    ports:
        - 9200:9200
    expose:
        - 9300
    ulimits:
        nofile:
            soft: 65536
            hard: 65536
        # https://github.com/docker-library/elasticsearch/issues/111
        # uliimit: リソースの制限を拡大させている。
  kibana:
    build: kibana
    links:
        - elasticsearch:elasticsearch
    ports:
        - 5601:5601

volumes:
    es-data:
        driver: local
```

#### es/Dockerfile
```
FROM elasticsearch:6.7.1

# kuromojiをインストール
RUN elasticsearch-plugin  install analysis-kuromoji
```

#### kibana/Dockerfile
```
FROM kibana:6.7.1
```

## 開発の流れ
今回は参考サイト[3]でチュートリアルをした。それを元にフローチャートを考えた。
1. まず、分析するデータを作成or見つける
2. index_templateを作成する。<br>
つまり、そのtemplateを使ってindexを作成する
3. mapping_templateを作成する。<br>
つまり、そのtemplateを使ってmappingを作成しておく。<br>
mappingというのは、index内をtype別に綺麗に分ける際の決まりのこと。
4. データを登録する。<br>
elasticsearchはjson形式のみ対応なので、うまく整形する。その時に便利なAPIを使えば大量のデータでも楽に登録ができる。
5. 検索やデータの分析

＊(注意)開発のやり方について<br>
開発に慣れている場合は、`curl`を使った方がわかりやすい。
ただ、検索はクエリが長くなるので'kibana'のDev toolのほうが楽。

## 注意点
- shardとreplica[1]<br>
実際に動かしてみないとわからない。というのが本音。<br>
一応、開発時点ではコピーを作らなくすることで解決。つまり、replica数を0にする。
- バージョンの違い<br>
参考サイトのelasticsearchのversionは大体がver.2であるが、最新はver.6<br>
その差がかなりのエラーを出すことがわかった。
参考サイト[2]を参照してエラーを処理すること。<br>
  - __Content-Type の指定が必須__<br>
> Elasticsearch への API は Transport通信を除いて、HTTP(s) リクエストによって操作します。Elasticsearch 5系までは自動検出していた Content-Type ヘッダですが、Elasticsearch 6系より指定が必須となりました。[2]

  - フィールドタイプに__stringが指定できない__
  > Elasticsearch 5系から文字列を扱うフィールドタイプがstringからtext、keywordに変更しました。5系ではstringタイプは非推奨となり指定することができました。6系ではstringタイプを指定するとエラーになるように変更となりました。[2]

- mappingについて<br>
注意点として、__一度定義したマッピングは変更することができない！！__
変更する場合はインデックスごと削除して再作成する必要がある・・・<br>
逆にフィールドの追加はできる。



##### 参考サイト
[1][Elasticsearchのshardとreplica](http://t-cyrill.hatenablog.jp/entry/2015/02/18/190310)<br>
[2][Elasticsearch 6 を利用する前に把握しておいた方がよさそうなこと](https://dev.classmethod.jp/server-side/elasticsearch/elasticsearch-6-breaking-changes/)


## 参考サイト
[1][3分で分かった気になる、Elasticsearchとは？](https://qiita.com/r548/items/3622048a622d9c0acc05)<br>
[2][Elasticsearch, KibanaをDocker環境で動かしてみた](http://tech.innovation.co.jp/2018/08/09/constructing-enviroment-for-Elasticsearch-and-Kibana.html)<br>
[3][Elasticsearch 6 を使ったデータ検証 その1（Dockerでコンテナの作成と確認）](https://developer-collaboration.com/2018/08/10/elasticsearch-6-1/)<br>
[4][公式サイトのチュートリアル]((https://www.elastic.co/jp/webinars/getting-started-elasticsearch?elektra=home&storm=sub1))