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を比べてみようにも参照してみてください。
なんでElasticsearch使う
Luceneはただのライブラリーである。それを使うのにjavaのプログラムに組み込まれなければいけません。かつ検索に対して知識を持たなきゃ、Luceneを使うのになかなか難易度が高い。
上記の問題を解決する為に、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"
}
動作確認②
余談
以下の設定は必須ではないので、あくまで必要に応じて設定してください。
Elasticsearchのヒープサイズ
ヒープサイズが大きければ大きいほど、キャッシュメモリが多くて、早いらしいです。
私の場合4gを512mにした。
# vi /etc/elasticsearch/jvm.options
-Xms*** → 調整
-Xmx*** → 調整
# systemctl restart elasticsearch → 設定反映する
仮想メモリサーズ
# vi /etc/sysctl.conf
vm.max_map_count=262144 → 必要なサイズを追記
# sysctl -p → 設定反映する
elasticsearch-headの導入
ESのオフィシャルにはGUI特に提供されてないため、elasticsearch-headプラグインはそれを解決し、GUIでも見れるようになる。
elasticsearch-headのソース
githubにあるので、↓から入手できる。
インストール方式
全部で四種類の方式でインストールできそうで、今回は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 を入力
一応表示されてるが、つながってないようです。
設定ファイル編集
# vi etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true → 追記
http.cors.allow-origin: "*" → 追記
# systemctl restart elasticsearch → 設定反映のため再起動
できたようです
再度確認
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になってますね。
これで完成です。
つまずいたら他のインストール記事にも参照してください。
Elasticsearchの基本概念
ではいよいよ本番に入りたいと思いますが、その前に公式サイトに基本キーボードの概念が紹介されたが、理解した上で進めた方が良いですが、残念ながら、読んでも意味わからなかった。ここで改めて各キーワードに対して簡単に説明したいと思います。
- リアルタイム
- 文字通り
- ノード
- Elasticsearch Serverのことを指します。
- クラスタ
- クラスタはデータ全体を一緒に保持する1つ以上のノード(サーバー)のコレクション、elasticsearchを用いて検索する時にトラフィック当然発生する。トラフィックを分散させるため、通常何台もelasticsearch serverが必要ですね。複数のノード、つまりサーバー群 (Elasticsearch Server) のことはクラスタといいます。
- インデックス
- データを保存する場所。名前通り索引です。複数持つことができて、中に検索対称のドキュメントを格納する。
- タイプ
- RDBと言ったら、テーブルに相対する。インデックス内に1つ以上のタイプを定義できる。タイプの目的によって、格納するデーター(ドキュメント)が違う。
- ドキュメント
- RDBと言ったら、レコードに相対する。データー実態そのものです。検索の最小単位はドキュメント
- シャード
- インデックスを分割したもの、分割後二種類があります。プライマリーシャード(Primary Shard)とレプリカシャード(replica shard)がある。例えば、分散のため、もしくは障害時でも対応できるため、データーベースを分散して作る必要がある。そのデーターバースのコピーもとはプライマリーで、データーの更新などをやってる。複製のDBはレプリカという、プライマリーをコピーするだけやってる。
タイプはバージョン8から廃止する予定だそうで、理解しなければ飛ばしてよいです
それぞれの関係は以下の表を見て理解しやすいと思います。
そのほかには下のような図もあって、理解するように頑張ってください。
ElasticsearchとDBの比較
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields