記事を読みながら理解する！Elasticsearch入門者が抑えておきたい内容まとめ

分散型でオープンソースの検索・分析エンジン、Elasticsearch。
最近、興味がある、これから業務で使う予定、なんて人もいるのではないでしょうか。
そんな時は、

- [Elasticsearch Reference | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html)
- [Elasticsearchのデータ操作入門 | Elastic](https://www.elastic.co/jp/webinars/getting-started-elasticsearch?baymax=default&elektra=docs&storm=top-video)

を見ておけばオッケ～！！

・・・といえば（公式のだし）間違いなくそうなんですが、

- とっかかりが英語だとハードルが高い
- とりあえず要点だけ把握してガンガン使ってみたい

となる人も多いと思うので、入門者向けにいい感じの記事をピックアップ＆実際に動かしてみることを想定して、まとめてみました。

## 前提条件
- OS：Windows10
- プログラミング言語：Java

環境作って実際に動かしてみる、というところに重きを置いてます。
自分のメイン環境、言語が上述の通りなのでその点はご堪忍。
それ以外の環境の人は、「本題」の3, 4辺りを参考程度にご覧くださいませ。
※一部公式サイト参照（=英語）しておりますが、ご了承を。

## 本題

### 1. curlのダウンロードと設定
サーバとデータをやりとりするためのツール、curl。
Elasticsearchやのに、なんでイチバンにcurlやねんっ！ってなりそうですが、コマンドベースで操作を行うには必須。
で、Windowsには、残念ながらデフォルトではcurlは入ってない。
ダウンロードが必要なわけです。

- [Releases and Downloads | curl / Download](https://curl.haxx.se/download.html#Win64)

より、ダウンロード→解凍して、binフォルダまでのパスを環境変数（ユーザー環境変数）に設定しておきましょう。
そして、コマンドプロンプトで、以下のコマンドを実行して、日本語でも文字化けないようにしておきましょう。

```:文字コードをUTF-8に変更
> chcp 65001
```


curlがそもそもよくわからへんから、基本的な使い方を押さえておきたい、という方は、

- [curl コマンド 使い方メモ | Qiita](https://qiita.com/yasuhiroki/items/a569d3371a66e365316f)
- [よく使うcurlコマンドのオプション | Qiita](https://qiita.com/ryuichi1208/items/e4e1b27ff7d54a66dcd9)

がとても参考になりますので、一読しておくとよいでしょう。

### 2. Elasticsearch（とKibana）環境の準備
ではいよいよ、Elasticsearch環境を構築していきましょう！
Kibanaはなくてもいいのですが、

- Elasticsearchの操作を簡単にしたり、
- データを可視化したりできる

便利なツールなのでぜひこちらも入れておきましょう。

- [【Elasticsearch入門】環境構築 Windows編 | Qiita](https://qiita.com/doiken_/items/7847f8fd2bd65ceeaf18)

を参考にすればWindowsでの環境が準備できちゃいます♪
・・なんですが、ダウンロードにめっっっちゃ！！！時間がかかる（自分は3.5時間ほどかかった：Kibanaはそれほどでもない）ので、Dockerまあまあ使えるよって人は

- [初めてのElasticsearch with Docker | Qiita](https://qiita.com/kiyokiyo_kzsby/items/344fb2e9aead158a5545)
- [Elasticsearch + KibanaをDocker Composeで動かす | Qiita](https://qiita.com/sugikeitter/items/f3b2c57bf8bbdc47a8bc)
- [Dockerコンテナ上のElasticsearchのデータを永続化する | Qiita](https://qiita.com/matyahiko2831/items/0b07a7577142c00d50e7)

あたりを参考にサクッと環境構築してしまってもよいですね。
（こちらは設定内容の見直し込みでも1時間かかりませんでした。）

公式サイトだと、

- [Install Elasticsearch with Docker | elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)

に記載がありますので、こちらもご参考に。

### 3. 基本的な概念を理解する
それでは！早速動かしてみましょう！
と、その前に、基本的な概念を理解しておくのが大切ですね。
そもそも、環境うんぬんの前にまずそこやろ～っていうのは置いておいて、最低限押さえておきたい内容を以下に。

よく出てくる用語については、RDBと比較するとイメージがつきやすいと思います。
調べると諸説でてきますが、一番しっくりきた組み合わせが以下の通り。

|RDB|Elasticsearch|
|---|---|
|データベース|Cluster|
|テーブル|Index|
|テーブル定義|Mapping|
|レコード(行）|Document|
|カラム（列）|Fields|
|プライマリーキー（主キー）|Document ID|

もちろん異なる部分もあるので、詳しくは

- [クライアントを作って学ぶElasticsearch | iPRIDE](https://www.ipride.co.jp/blog/3994)

をご覧ください。

続いて、analyzer。
analyzerとは、テキスト分析といって、検索するのに最適なフォーマットに変換するプロセスを行ってくれるものになります。
analyzerは、大きく分けて以下の3つから構成されています。

|名称|内容|
|---|---|
|Character filters|文字列に対し、Tokenizerで分割する前に必要な処理（追加、削除、変更）を行う。<br>前処理的ポジションで、使用は任意。|
|Tokenizer|文字列を単語レベルに分割する役割を持つ。<br>必須項目。|
|Token filters|Tokenizerで分割された内容に対し、必要な処理（追加、削除、変更）を行う。<br>後処理的ポジションで、使用は任意。|

公式サイトでは、

- [anatomy of analyzer | elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer-anatomy.html)

に記載がありますので一度確認しておきましょう。

最後に、aggregations。
検索クエリに基づいて、データを集計します。

公式サイトの

- [aggregations | elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)

辺りを参考に。


### 4. コマンドベースで動かしてみよう

ではいよいよ、Elasticsearchを操作してみましょう～！

全般的な内容については、

- [はじめての Elasticsearch | Qiita](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329)
- [【Elasticsearch】よく使うコマンド一覧 | Qiita](https://qiita.com/mug-cup/items/ba5dd0a14838e83e69ac)

あたりを参考に。

SQLとの比較、という観点では、

- [SQLとElasticsearchとのクエリの比較 | Qiita](https://qiita.com/NAO_MK2/items/630f2c4caa0e8a42407c)
- [ElasticsearchとSQL対比しながら理解 | Qiita](https://qiita.com/kieaiaarh/items/5ea4e8a188bd9814000d)

あたりがとてもわかりやすくまとまってます♪



まずは上記の記事たちを参考に、コマンドベースで、

- インデックスの作成
- データ投入＆更新
- クエリ実行

あたりを一通りやってみるとよいですね。

余力があれば、analyzer, aggregationsについても一通りやっておくとよいでしょう。

analyzer（日本語使用）については、

- [Elasticsearchで、分かち書き(kuromoji:形態素解析)したqueryを_searchする。 | Qiita](https://qiita.com/ume1126/items/b8be3ce191944cbf83e5)
- [Elasticsearchを日本語で使う設定のまとめ | Qiita](https://qiita.com/shin_hayata/items/41c07923dbf58f13eec4)
- [【elasticsearch】Kuromojiとngramで検索精度を上げてみる | Qiita](https://qiita.com/dai-maru/items/8717c9fb31bf43e1cd31)

あたりを参考に。

aggregationsについては、

- [ElasticsearchのAggregationsを利用したファセットの実現 | Qiita](https://qiita.com/NAO_MK2/items/9f0a04d4042503579082)
- [Elasticsearchの"Aggregations"を使って SQLの"Group by"を置き換える | Qiita](https://qiita.com/jtodo/items/be053be4aa704e6c57d0)

辺りが参考になります。

### 5. プログラミング言語（Java）で動かしてみよう
プログラミング言語を使っても操作できます！

- [Information out: search and analyze | elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyze.html)

によれば、ElasticsearchはJava、JavaScript、Go、.NET、PHP、Perl、Python、Rubyと8種類ものプログラミング言語に対応している、とのことなんですが、冒頭でも述べた通り自身のメイン環境がJavaなので、今回はJavaで。

日本語記事なら、

- [Java High Level REST Client Tips | Qiita](https://qiita.com/take333/items/5792e190f4ec312d60f3)

がとてもよくまとまってます。

本家本元のトップページは以下。

- [Java REST Client | Elastic](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html)

うち個人的にココは押さえておきたいなと思ったのが以下のページ。

- [Building Queries | Elastic](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-query-builders.html)<br>
→ コマンドベースでのクエリと比較されてて、わかりやすい！

こちらも実際にコードを書いてみて、動きを見てみるのがいいですね。

## 所感
最初はとっつきにくく、Elasticsearchコノヤロー！！ってなっていたのですが、使っていくうちに随分理解ができてきて、愛着がわくようになってきました。
カスタマイズの幅が大きく、育てがいがありそうなのもいいところ。

自分自身もこの記事執筆時点の2020/09/03の時点で触り始めて約2週間。
まだまだこれからですが、習うより慣れろ、で進めていきたいと思います！

## 更新履歴

|日付|内容|
|---|---|
|2020/09/03|初版投稿|
|2020/09/04|analyzer, aggregationsに関する内容を追加|


## 参考
本文には載せてないけど、大いに参考にさせていただいた記事たちです。

### 1. curl
- [Windows 環境における curl コマンド利用のまとめ (平成最終版) | Qiita](https://qiita.com/yamachan360/items/8c928738289cd518eec8)

### 3. 基本的な概念を理解する
- [Elasticsearch マッピング | Hello! Elasticsearch.](https://medium.com/hello-elasticsearch/elasticsearch-9a8743746467)
- [Amazon Elasticsearch Serviceについてまとめてみる | Qiita](https://qiita.com/corn0214/items/ed777d7bfa3d5353fd5a)