はじめに
Elastic 社が開発しているスケーラブルな全文検索エンジン、Elasticsearch が最近よく利用されいます。
複数のサーバーを横断して検索することがごく当たり前の用途として提供されており、
AWS(Amazon Web Service)などで簡単に利用することができます。
どのような構成、単位で構築し、どのようにデータを保持しているのでしょうか?
この記事では、Elasticsearch の構成について解説いたします。
参考
実際に動かしてみたい方は、「Elasticsearch+Kibanaのローカル環境構築メモ」をどうぞ。
Elasticsearch の概要
- スケーラビリティに優れた全文検索エンジン
- Apache Lucene をコアにしており高速な検索が可能
- REST API によるシンプルな入出力インターフェイス
- ログ収集の Logstash や fluentd、BIツールの Kibana と一緒に利用される
構成の全体像
Elasticsearch の全体像です。
物理構成、論理構成に分けて、後に詳しく説明いたします。

Elasticsearch全体像
物理構成
Elasticsearch の物理構成は、クラスタ、ノード、シャードの3つの要素で形成されています。
クラスタ(=サーバ群)
複数のノード(Elasticsearch サーバ)を1つの Elasticsearch として実行されます。
この集合の単位を「クラスタ」と呼びます。
クラスタ形式とし、大量のデータを複数のノードに分散して保持することで、
冗長構成とすることや、スケーラビリティ、パフォーマンスを発揮できるようになっています。
ノード(=サーバ)
Elasticsearch の1プロセスを「ノード」と呼びます。
通常は1つのサーバに1つのプロセスを実行するため、サーバを意味します。
複数のノードを起動してクラスタとして纏めることも可能で、
単一のノードを起動してクラスタとすることも可能となっています。
シャード
各インデックスを分割したものを「シャード」と呼び、クラスタ内の複数のノードに分散させます。
シャーディングにより、データの並列処理とパフォーマンスの向上が可能になります。
また、シャードにはプライマリシャードとレプリカシャードがあります。
プライマリシャード
インデックスの書込みと読込みの両方で使用されます。
プライマリシャードにデータを保存し、レプリカシャードにデータをコピーします。
レプリカシャード
プライマリシャードのコピーで、インデックスの読込みに使用されます。
プライマリシャードが破損した場合などは、該当のレプリカシャードが昇格して冗長性を確保します。
論理構成
Elasticsearch の論理構成は、インデックス、タイプ、ドキュメント、マッピングの4つで形成されます。
インデックス(=Database)
RDB(Relational Data Base)におけるデータベースに相当します。
インデックスは関連するドキュメントの集合を格納する論理的な名前空間です。
インデックスは、データの検索と分析を容易にするために作成されます。
また、各インデックスを横断して検索することもできます。
タイプ(=Table)
RDB におけるテーブルに相当します。
インデックスに登録するドキュメントを分類するもので、こちらも横断的に検索可能です。

ドキュメント(=Record)
RDB におけるレコードに相当します。
ドキュメントは JSON 形式で表現される単一の情報のユニットで、複数のフィールドから構成されます。
それぞれ Key と Value を持ち、各ドキュメントで異なった構造を持つことができます。
マッピング(=Schema)
RDB におけるスキーマに相当します。
Elasticsearch はデータを入力する前にデータベースやテーブルを作成する必要がありません。
代わりに、フィールドとそのデータがどの型で管理すると最適なのかを自動で判別し
マッピングを生成します。