【Elasticsearch】初心者メモ〜概念から起動まで

# Elasticsearchとは
様々なユースケースを解決する分散型RESTful検索/分析エンジン
[公式サイト](https://www.elastic.co/jp/products/elasticsearch)

## 分散型とは
以下、[Wikipedia](https://ja.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E5%9E%8B)より引用。
>分散型（ぶんさんがた）とは、複数のコンピュータなどに分散して機能を持たせること、またはそれで一つの機能を動作させる考え方。集中型の反対の意味として用いられる。

分散型で構成することにより、高速で柔軟な検索が可能になります。

### 参考記事
[Elasticsearch](https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/what-is-elasticsearch/)
[はじめてのElasticsearchクラスタ](https://www.slideshare.net/snuffkin/elasticsearch-107454226)

## Restfulとは
分散型システムを使いやすくする仕組み、設計方法の一つ。
以下、[RESTful APIとは何なのか](https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2)より引用。

>REpresentational State Transferの略で、分散型システムにおける複数のソフトウェアを連携させるのに適した設計原則の集合、考え方のこと。Roy Fieldingが2000年に提唱した。

## どうして使うのか
ユーザーのニーズにあった柔軟な検索を行うため。

こちらのサイトで分かりやすく説明されています。
[第8回　Elasticsearchの基礎を学ぶ](https://gihyo.jp/dev/serial/01/js-foundation/0008?page=1)

>昨今のWebサービスでは，以前のようにユーザが努力をして興味のあるコンテンツを探すサービスから，キュレーションサービスのようにユーザの興味を分析し配信することが重要とされています。

類似文書検索([More Like This Query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html))など、RDBには存在しない機能も提供できます。

>RDBMSは条件にマッチしたデータを正確に返すのと比べ，Elasticsearchは条件との関係性の高いデータを返すという点があります。

[Kibana](https://www.elastic.co/jp/products/kibana)というデータ可視化ツールを使用すれば、ログ分析も可能です。

## 用語集
以下、[第１回 Elastisearch 入門 インデックスを設計する際に知っておくべき事](https://dev.classmethod.jp/server-side/elasticsearch-getting-started-01/)より。

>Elasticsearchの``Index``は、物理的な要素である複数の``Shards``から構成されていて、その``Shards``を複数の``ノード``に分散することで１つの``Index``に対するデータ量や書き込み速度を分散することができる仕組みになっています。

| 用語       |  説明 |
|:----------|:------------------|
| Cluster  |Nodeの集合体
| Node     |RDBのサーバに該当|
| Index    |RDBのDatabaseに該当|
| Type     |RDBのTableに該当|
| Document |RDBのRowに該当|  
|Field     |RDBのColumnに該当| 
| Shard    |Indexを物理的に分割したもの|
|Primary Shard|書き込み可能なShard|
|Replica Shard|読み取り専用のShard|

Typeはバージョン7.0より完全廃止されるそうです。
["タイプ"廃止へ。"タイプレス"が登場！](https://www.elastic.co/jp/blog/moving-from-types-to-typeless-apis-in-elasticsearch-7-0)

### 参考記事
[第６回 Elasticsearch 入門 基本コンセプトを理解する](https://dev.classmethod.jp/server-side/elasticsearch-getting-started-06/)
[Elasticsearchで最初にぶつかるワードたち](https://qiita.com/a4_nghm/items/94ed0640ed8a15ce1592)
[Elasticsearchについて](https://qiita.com/gitya107/items/597ac557ff187d136d63)
[Elasticsearch 一目で分かるアーキテクチャ](https://qiita.com/kotarella1110/items/5b90bd9166dd44da49de)

# インストール

## 使用環境
- macOS Mojave 10.14.6
- Homebrew 2.1.16

## インストールを実行

Elasticsearchを動かすにはJavaが必要です。
Java無しの状態でElasticsearchをインストールしようとすると、エラーが発生します。

```bash
$ brew install elasticsearch
elasticsearch: Java 1.8 is required to install this formula.
Install AdoptOpenJDK 8 with Homebrew Cask:
  brew cask install homebrew/cask-versions/adoptopenjdk8
Error: An unsatisfied requirement failed this build.
```

そのため、先にJava開発キット``JDK(Java Development Kit)``をインストールします。
先ほどのエラー表示に出力されていたコマンドを実行します。

```bash
$ brew cask install homebrew/cask-versions/adoptopenjdk8
```

Javaをインストールできました。

```
$ java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.232-b09, mixed mode)
```

これでElacticsearchをインストールできます。

```
$ brew install elasticsearch
```

インストールが完了したら、Elasticsearchを起動します。
警告が出力されますが、自己解決しなかったのでこのまま進めました;

```
$ elasticsearch
OpenJDK 64-Bit Server VM warning: Cannot open file logs/gc.log due to No such file or directory
```

デフォルトで``9200番ポート``が使われています。
ブラウザで``localhost:9200``へアクセス、もしくは別にターミナルを起動して``curlコマンド``を実行すると起動を確認できます。

```
$ curl localhost:9200
```

次にKibanaをインストールします。

```
$ brew install kibana
```

起動します。

```
$ kibana
```

Kibanaはデフォルトで``5601番ポート``が使われています。
ブラウザで``localhost:5601``へアクセスすると起動が確認できます。