Elasticsearchとは、2010年に開発されたApache Luceneをベースとしたオープンソースの検索エンジンです。
Elasticsearchは、全文検索を目的として開発されたものでしたが、ログの収集を行うLogstashや、ブラウザ上でデータを解析するkibanaを組み合わせて使用することが多く、3つを総称して「ELK (elasticsearch, logstash, kibanaa) Stack」と呼ばれることも多いです。
一般的に、ElasticsearchはRDBと比較して、検索処理が高速でパフォーマンスも高く、スコアリングや高度な検索が可能となっています。また、ノードを増やすことによって、スケーラビリティの面も担保しているため、大規模なアプリケーションにもElasticsearchは適しています。
Elasticsearchの特徴をまとめると以下のような感じとなっています。
- 自然言語処理や形態素解析が可能
- 分散配置による、処理の高速化とスケーラビリティの担保
- REST APIによってアクセスできる
- ログ収集やビジュアライズ化などの他のソフトウェアとの連携が可能
今回は、そのElasticsearchの基礎的な用語について解説したいと思います。(随時更新中です)
Elasticsearchの用語
Document(ドキュメント)
Elasticsearchでは、格納するデータの単位をdocumentと呼んでいます。これは、RDBのrowに当たるもので、JSONフォーマットで表現します。例えば、以下のような感じです。
{
"id": "1",
"title": "Elasticsearch完全ガイド",
"author": "Koki Nagai",
"page": "300"
}
このように、{}の中に、key:valueの形で1つのフィールドを表現します。上の例では、idを付与していますが、明示的にidを書かなくても、Elasticsearch側で自動でidを付与してくれます。
Field(フィールド)
上記のデータで言うと、"id": "1"
のような、key : valueの組を言います。このvalueのデータ型として、いくつか紹介します。
- text
- 文字列を格納するデータ型
- text型はAnalyzerと呼ばれる、文字列を単語分割される
{ "title": "The perfect guide of the Elasticsearch" }
- keyword
- text型と同様、文字列を格納するデータ型
- keywordとは異なり、検索の用途は「完全一致」
- Analyzerによって、単語分割はされない
{ "place": "東京タワー" }
-
float、short、integer、long
- 数値を表す
-
オブジェクト型
- keyに対して、valueがネスト構造を持つことができる
- このvalueをオブジェクトを表すデータ型と表せる
{ "address": { "postalcode": "1111111", "prefecture": "愛知県", "city": "名古屋市" } }
Index(インデックス)
ドキュメントを保存する場所です。ドキュメントをそのまま保存する訳ではなく、kuromojiやn-gramといった自然言語処理よって単語を分割したりして、保存しています。また、保存する際に、シャードと呼ばれるインデックスを一定の単位で分割して、分散的に配置されるようにしています。
Mapping(マッピング)
インデックスをどのようにして保存するかを定義したもので、RDBでいう所のスキーマにあたります。
Node(ノード)
Elasticsearchのプロセス。
Master-eligible Node
Elasticsearchのクラスタは必ず1つのMaste-eligible Nodeを持つ必要があります。Master-eligibleノードは以下の特徴を持ちます。
- インデックスの作成と削除
- 各ノードがどこのクラスターに所属しているかの監視
- シャードの割り当てや再配置
Dataノード
Dataノードはデータに対する操作(検索やCRUD)や、クエリの応答などの役割を担っています。
Cluster(クラスタ)
互いに協力して動作するノードグループ。
Shard(シャード)
上記に記載のインデックスの際に、データを異なるnodeに分散して保存することによって、処理性能を向上させたり、スケーラビリティを持たせたりします。この分散的な保存の単位をシャードと言います。
シャードの数はインデックス作成時には指定できますが、インデックス作成後は変更はできないため、事前にどの程度拡張することが予想されるかを見積もって指定する必要があります。