elasticsearchを使ってみる

[Elasticsearchは、分散型でオープンソースの検索・分析エンジンです。by elastic](https://www.elastic.co/jp/what-is/elasticsearch)
って、ぶっちゃけ何言ってるかよくわかんない。
全文検索できるっていうから、ちょっと前にクローラーでデータ登録してプチgoogleみたいに使って喜んでいたのだが、kibanaが絡んできたりするとなんかよくわかんねー。
なので、なんかのデータを登録して、よくわからない条件で分析などしてみて、これでおいらもデータサイエンティストさ、ごーごーデータどぶリン、って言ってみたい。
これは、そんな野望の全貌をつづった作業ログである。なんちて。

#１．elasticsearchを入れてみる
環境はこんな感じにしてみる。
・VirtualBoxによる仮想サーバーを利用
・OSはcentos8
・ホストosはwindows10だけどね

centos8がインストールされたVirtualboxの仮想サーバーは、下ごしらえで各自作っておくように。

ここにjavaとelasticsearchをインストールする。
参考サイト：[CentOs8 Elasticsearchをインストールする手順](https://mebee.info/2020/05/15/post-11377/)
言われるままにコマンド入れたりすると、javaとelasticsearchがインストールされた。よしよし。
そのあとservice登録、firewall設定と進んで、ホストOSからアクセスしたら、エラーになった。
firewall設定で開けるポートって、9200じゃね？
9200開けてみたら、つながりました。

#2.データを投入してみる
とりあえずPostmanでjsonデータをいきなり入れてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/7fc31f80-803c-296f-e649-e48881504318.png)
なんか出来たっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/33936d88-992f-6ef1-8fc6-0a80d7596982.png)
入れたキーを指定してGETしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/ca4d65b3-46d8-5c37-e273-b1fc526e8c79.png)
さっき入れたデータが_sourceの中に入っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/a4368667-397b-d294-2981-19d4a8fc8b22.png)
これだけ…？何にもしないでデータ登録＆呼び出しができてしまった。

#3.kibanaをインストールしてみる
[このサイトを参考にした。](https://mebee.info/2020/05/18/post-11464/)さっきの記事とおんなじ人だね。多謝！
なんか設定は正しく出来ているのに、つながったりつながらなかったりする。
サーバー再起動等行って、なんか立ち上がったようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/8e24abb1-a80f-545f-8439-4a547488a0ee.png)

#4.kibanaで分析してみる
ここまではいいのだ。大体みんなが言った通りやっていればたどり着くのだ。
ここから俺はどうしたらいいのだ？
試しにkibanaでさっきPostmanから投入したデータを参照してみる。

左メニューのManagementの中の、Dev Toolsを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/b3b41fc2-0cbe-c67b-65a0-70ce722f6795.png)
入れるコマンドは基本curlとかと同じようなイメージ。
ただ、elasticsearch前提なので、インデックス名以降を指定すればよいようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/58e607bc-012d-ef6b-5f29-38e71e4b093e.png)
入力したコマンドの右側の緑三角をクリックすると、右側に結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/b6f8f183-7e49-e83d-ccf4-82f20c105b08.png)
でも、こうじゃねーんだよ。なんかもっと、データサイエンティストなどぶリンなあれをしたいんだよ。
なので、Discoverを使ってみる。
左メニューからkibanaの中のDiscoverをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/288e6f60-2cda-39c0-d5dc-c310fc3e72fe.png)
どうやらindex patternというものを作るらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/03ce2f6f-3d72-ff17-c550-466026b606bc.png)
今一つだけ出来ている「receipt」を指定してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/f2dbfa95-b502-1948-169a-9dd8f6b0bd24.png)
次の画面で検索するときに使用する時間関係の項目を指定する。日付とか時刻とかね。これを指定しないと、後々データが検索できない。
とりあえずcreate_atをしてしておいて、Create index patternをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/ccf5486b-6d2f-8710-2f09-5ad9ca0d552a.png)
何かができたらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/fb4c2c7d-9282-cde1-24a6-2a5d52f7b6bf.png)
なんとなく環境出来たっぽいから、データをきちんと入れてみるよ。

#5.logstashでMySQLのデータをelasticsearchに入れる
今回は昔ながらの伝票データを入れてみたいよ。
すなわち、ヘッダレコードに合計金額とか入っていて、明細レコードが複数できている、あれだ。よく知らない若者は、お父さんとか年老いたSEに聞いてみてね。
laravelでseeder使って大量発生させたデータがMySQLに入っているので、これをelasticsearchに入れてみる。
elasticsearchでは非正規データを入れろとか、親子関係はお勧めしない、なんて言われるから、logstashの中で伝票データをひとまとめにしてelasticsearchに入れてみる。
とりあえずlogstashをインストールだ。[このサイト](https://qiita.com/tikeda0924/items/d9ffd43e18da3a64681d)を参考にさせていただきました。が、インストールはdnfでしちまったよ。この辺は好みか？
インストール出来たら、MySQLからデータを取ってくるよう、logstash.confを作成する。
と、その前にjdbcを入れとかなくちゃならない。
見よう見まねでインストールしてみる。


```cmd:レポジトリ登録
# dnf localinstall https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
```

```cmd:インストール
# dnf install mysql-connector-java
```

どこに入ったかわからないので、探してみる。

```CMD
# find / mysql-connector* | grep "mysql-connector"
/var/cache/dnf/mysql-connectors-community-36a49e3556a965a0
/var/cache/dnf/mysql-connectors-community-36a49e3556a965a0/repodata
/var/cache/dnf/mysql-connectors-community-36a49e3556a965a0/repodata/repomd.xml
/var/cache/dnf/mysql-connectors-community-36a49e3556a965a0/repodata/4a1e62c80aefb9ae9dcc85524652f5e6f6d01fdb-filelists.xml.gz
/var/cache/dnf/mysql-connectors-community-36a49e3556a965a0/repodata/408890bf2054a439cca0f5a2988e8e11c7a08276-primary.xml.gz
/var/cache/dnf/mysql-connectors-community-36a49e3556a965a0/packages
/var/cache/dnf/mysql-connectors-community.solv
/var/cache/dnf/mysql-connectors-community-filenames.solvx
/usr/share/doc/mysql-connector-java
/usr/share/doc/mysql-connector-java/CHANGES
/usr/share/doc/mysql-connector-java/INFO_BIN
/usr/share/doc/mysql-connector-java/INFO_SRC
/usr/share/doc/mysql-connector-java/LICENSE
/usr/share/doc/mysql-connector-java/README
/usr/share/java/mysql-connector-java.jar
```

/usr/share/java/に入っていた。
これを指定して、logstash.confを作ってみる。

```/etc/logstash/conf.d/logstash.conf
input {
  jdbc {
    jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.10.10:3306/receipt"
    jdbc_user => "receipt"
    jdbc_password => "p@ssw0rd"
    statement => "select * from receipt inner join receipt_detail on receipt.id = receipt_detail.receipt_id"
  }
}
filter {
  jdbc_streaming {
    jdbc_driver_library => "/usr/share/java/mysql-connector-java.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.10.10:3306/receipt"
    jdbc_user => "receipt"
    jdbc_password => "p@ssw0rd"
    statement => "select * from receipt_detail where receipt_id = :receipt_id"
    parameters => {"receipt_id" => "id"}
    target => "receipt_details"
  }
} 
output {
  elasticsearch {
    index => "receipt"
  }
} 

```

conf書いたら保存して、logstashを実行する。
logstashは/usr/share/logstash/binに入っていた。
なので、こんな感じで動かしてみる。

```cmd
# cd /usr/share/logstash
# bin/logstash -f "/etc/logstash/conf.d/logstash.conf"
```

kibanaで見てみると、なんか入ってる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/393c82d8-4c62-d980-6095-a06c2a61d77b.png)
よしゃ。
左メニューから項目をポイントして、表示された「ADD」のボタンをクリックすると、その項目だけ表示されるようになる。必要な項目だけ選べるので見やすくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/06fe3263-eae4-0590-43a7-f591ae7f9e97.png)
しかし、どうせやるならやっぱりグラフとか地図とかにしたいよね。
とりあえずグラフ作ってみよう。
右メニューからvisualizeをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/646553b6-3f2b-fd8d-7ebe-30dc956e4046.png)
最初に作るときは、真ん中の青ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/e6eb39ec-909c-2ccd-3e9a-7e884da209ec.png)
New Visualizationの中からPieをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/95144b77-c803-5fc1-73f7-d7af79dbd7e0.png)
作成したreceiptを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/7fa10cde-21f9-131b-1021-52bcfe576408.png)
初期画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/ad5be53c-525f-4219-6244-39364705d15d.png)
まずは対象となる時間帯を指定する。右上の、今「Last 15 minutes」の前にあるカレンダーマークをクリック。
時間帯を選択できる画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/c40b050e-e28a-e6f1-3fca-480b26cafefc.png)
今回はざっくり「Last 1year」を選択する。と、初期画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/a830b4c0-a9ed-fd28-3679-1948d7fc7bd5.png)
右の「Buckets」の「Add」をクリックすると追加するBucketの選択画面が表示されるので、Split sliceをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/7d2ba1cf-04c0-6ba4-7a30-397141f52bd3.png)
Splitslice
BacketsにSplit sliceが表示され、その下に「Aggregation」という項目が表示される。リストボックスから「RANGE」を指定すると、項目と範囲を指定できる画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/a5056996-db18-a424-0065-cee31fe538ab.png)
Fieldにグラフにする項目を指定して、その下に値の範囲を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/03257cfd-503d-c7ad-bd32-7b23604faecd.png)
適当に指定したら、右下の「Update」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137858/58ad42cc-0afa-42e0-8b4c-bd1f568e0d5e.png)
こんな風にグラフが作成される。
できた！

これでelasticsearchにデータを投入して、kibanaで分析する第一歩ができたね。
実際はどう分析するかが肝なんだろうけど。
それはおいおい考えていくよ。そのうち何とかなるだろう。
それじゃーね。ちゃお、あみーち！