Elastcisearch 7X からElasticsearch-headまで

# Elastcisearchとは

①Elasticstackのメイン部分（心臓の部分）
②主流検索エンジン
③オープンソース
④データーの保存、分析の仕事をする
⑤早すぎる
⑥RESTful インターフェースを使って操作できる
⑦luceneを基づいた開発されたもの（Elasticsearchインストール後、/etc/elasticsearch/libの中身覗いてみたら、Luceneがあることを確認できる。）

# Elastcisearchどこで使われる

ユースケースをご紹介します。

* 検索ボックス（アプリでもウェブでも）
* ログ、メトリックなどのデーターを保存し、分析する
* 機械学習を使用して、データの動作をリアルタイムで自動的にモデル化する
* 保存エンジンとして使う
* 地図情報分析する

# 検索エンジンの比較(Lucene、Solr、Elasticsearch)

* Lucene

検索ライブラリ、オープンソースであるため、世界中に認められたもっとも高性能の検索ライブラリである。現在知ってる限り一番高性能な検索エンジン。

* Apacche Solr

Apache Luceneに基づいたオープンソース、検索プラットフォーム、Web-serviceAPIを提供する、積極的にバージョンアップしない。Json、XML、CSVをサポートする。昔からのサービスでユーザーが多い、勉強コストが少ない

* Elasticsearch 

Apache Luceneに基づいたオープンソース、検索プラットフォーム、REST FULL Apiを提供する、Solrより拡張簡単、クラスタ組むのが簡単、Jsonだけサポート、月一のペースでバージョンアップして、それを維持するための知識を持つエンジニアが少ない、トラブルシューティングにそれなりのスキルが求められる。

上記以外に[SolrとElasticsearchを比べてみよう](https://www.slideshare.net/shinsuke/solr-vses2014)にも参照してみてください。

## なんでElasticsearch使う

Luceneはただのライブラリーである。それを使うのにjavaのプログラムに組み込まれなければいけません。かつ検索に対して知識を持たなきゃ、Luceneを使うのになかなか難易度が高い。

上記の問題を解決する為に、elasticsearchが誕生された。

# ダウンロード&インストール

[ホームページ](https://www.elastic.co/jp/downloads/elasticsearch)から必要な環境に応じてダウンロードしてください。
ダウンロードとインストールについてたくさん記事があるので、ここでは省略します。
私が使用する環境は以下通り

```
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 8.3.2011
```
# 動作確認①
```
[root@localhost ~]# curl http://localhost:9200
{
"name" : "localhost.localdomain",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "5DyhRe1RQiSml_rErADF_Q",
"version" : {
"number" : "7.12.1",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "3186837139b9c6b6d23c3200870651f10d3343b7",
"build_date" : "2021-04-20T20:56:39.040728659Z",
"build_snapshot" : false,
"lucene_version" : "8.8.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
```
# 動作確認②
ブラウザで確認する
![install.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/7180f929-e5ec-9e93-f4a8-d6a6c34612de.png)

# 余談
以下の設定は必須ではないので、あくまで必要に応じて設定してください。
### Elasticsearchのヒープサイズ
ヒープサイズが大きければ大きいほど、キャッシュメモリが多くて、早いらしいです。
私の場合4gを512mにした。

```
# vi /etc/elasticsearch/jvm.options
-Xms***　→　調整
-Xmx***　→　調整
# systemctl restart elasticsearch →　設定反映する
```
ディフォルト値は4gで、必要な場合調整してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/5f08d718-ae64-349f-ef27-f6295ece542e.png)

### 仮想メモリサーズ

```
# vi /etc/sysctl.conf
vm.max_map_count=262144 　→　必要なサイズを追記
# sysctl -p 　　→　設定反映する
```

# elasticsearch-headの導入
ESのオフィシャルにはGUI特に提供されてないため、elasticsearch-headプラグインはそれを解決し、GUIでも見れるようになる。

### elasticsearch-headのソース
githubにあるので、↓から入手できる。

https://github.com/mobz/elasticsearch-head

### インストール方式

全部で四種類の方式でインストールできそうで、今回はnpmでインストールする。
他にChromeプラグインのインストールでもできるので、そちらも推奨します。

```
# git clone git://github.com/mobz/elasticsearch-head.git
# cd elasticsearch-head
# npm install
# npm run start
```

### 動作確認

ブラウザで　http://xxx.xxx.xxx.xxx:9100 を入力
一応表示されてるが、つながってないようです。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/b0938d5c-8fda-4359-8d6e-3f08aafdf8cf.png)

### 設定ファイル編集

```
# vi etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true →　追記
http.cors.allow-origin: "*"　→　追記
# systemctl restart elasticsearch →　設定反映のため再起動
```
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/2aa8d0f1-54d4-207a-898d-18a6984cba20.png)

できたようです

### 再度確認

http://xxx.xxx.xxx:9200/_cluster/health?pretty=true にアクセスする

```
{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
```
statusがgreenになってますね。
これで完成です。

つまずいたら他のインストール[記事](https://qiita.com/yk-ms/items/5b5804075af5769f6e44)にも参照してください。

# Elasticsearchの基本概念

ではいよいよ本番に入りたいと思いますが、その前に公式サイトに[基本キーボードの概念](https://www.elastic.co/guide/jp/elasticsearch/reference/current/gs-basic-concepts.html)が紹介されたが、理解した上で進めた方が良いですが、残念ながら、読んでも意味わからなかった。ここで改めて各キーワードに対して簡単に説明したいと思います。

<dl>
  <dt>リアルタイム</dt>
  <dd>文字通り</dd>
  <dt>ノード </dt>
  <dd>Elasticsearch Serverのことを指します。</dd>
  <dt>クラスタ</dt>
  <dd>クラスタはデータ全体を一緒に保持する1つ以上のノード（サーバー）のコレクション、elasticsearchを用いて検索する時にトラフィック当然発生する。トラフィックを分散させるため、通常何台もelasticsearch serverが必要ですね。複数のノード、つまりサーバー群 (Elasticsearch Server) のことはクラスタといいます。
</dd>
  <dt>インデックス </dt>
  <dd>データを保存する場所。名前通り索引です。複数持つことができて、中に検索対称のドキュメントを格納する。</dd>
  <dt>タイプ</dt>
  <dd>RDBと言ったら、テーブルに相対する。インデックス内に1つ以上のタイプを定義できる。タイプの目的によって、格納するデーター（ドキュメント）が違う。</dd>
  <dt>ドキュメント </dt>
  <dd>RDBと言ったら、レコードに相対する。データー実態そのものです。検索の最小単位はドキュメント</dd>
  <dt>シャード</dt>
  <dd>インデックスを分割したもの、分割後二種類があります。プライマリーシャード(Primary Shard)とレプリカシャード（replica shard）がある。例えば、分散のため、もしくは障害時でも対応できるため、データーベースを分散して作る必要がある。そのデーターバースのコピーもとはプライマリーで、データーの更新などをやってる。複製のDBはレプリカという、プライマリーをコピーするだけやってる。</dd>
</dl>

<font color="Red">タイプはバージョン8から廃止する予定だそうで、理解しなければ飛ばしてよいです</font>
それぞれの関係は以下の表を見て理解しやすいと思います。
![index2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/0e15cf7d-db27-4c55-55d4-68c016633969.png)
そのほかには下のような図もあって、理解するように頑張ってください。
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755874/242b618f-fd01-d6f4-d556-6d3bf6f3e918.png)

## ElasticsearchとDBの比較

```
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields
```