Elasticsearch の基本用語

Elasticsearch に入門したということで基本の用語についてまとめました。

Document

  • Elasticsearch に格納するデータの一つの単位を指します。
  • RDS でいうレコードに相当します。
  • JSON形式のオブジェクトです。
  • Documentは一つ以上のFieldを持ちます。
  • IDは指定がなければ自動採番されます。

Field

  • Documentを表現するJSONオブジェクトの、KeyとValueの組み合わせを指します。
  • Fieldにはいくつかのデータ型が存在します。

www.elastic.cowww.elastic.co

以下に基本的な型のみ列挙しておきます。

text

  • 文字列を表す型です。
  • text型は格納される際に単語ごとに分割され、転置インデックスが構成されます。

keyword

  • 文字列を表す型です。
  • text型と異なる点として、単語が分割されません。
  • メールアドレスやURLなどの完全一致時のみヒットして欲しいような値を格納します。
  • keyword型でhttps://beatsbeats.hatenablog.com/を格納した場合、beatshatenablogで検索しても検索でヒットしません。

long,short,integer,float...etc

  • 数値を表す型です。(公式ページに詳しく記載があります。)

date

  • 日付を表す型です。
  • 下記のいずれかの形式を指定できます。
  • UNIXエポック(1970/1/1 0:00:00からのミリ秒表記):1420070400001
  • 日付のみ:"2015-01-01"
  • 日付+時刻:"2015-01-01T12:10:30Z"

boolean

  • 真偽を表す型です。

object

  • JSONオブジェクトを表す型です。(ネスト構造)

array

  • 配列を表す型です。
  • 配列の各要素は同じ型になります。

また、一つのFiledが複数のデータ型を持つことも可能です。(マルチフィールド型) 明示的に型を定義していない状態で文字列を格納した場合には、自動的にtextとkeywordが定義されます。 こちらは一見便利ですが、インデックスが増えて容量の増加に繋がります。

Documentの簡単な例
{ 
  "name": "Beats", 
  "age" : 26, 
  "birthday": "1994-10-29",
  "blog_url": "https://beatsbeats.hatenablog.com/",
  "job": ["monk","developer"], 
  "favorite_song": {"title":"fav_song","created_at":"2000-01-01"}
} 

Index

  • Documentを格納する場所を表します。
  • RDSでいうテーブルに相当します。
    • 元々はスキーマかデータベースに相当すると言われていましたが、後述のDocument typeが廃止になったためインデックス単位でデータの分別する他、データ格納場所を分ける方法がないためIndexがテーブルに相当すると言えます。
  • Documentがそのまま格納されているのではなく、検索しやすいように様々な形式で格納されている。

Document type

  • Documentの種別を表します。
  • 廃止となった概念です。詳細は下記の記事にあります。

www.elastic.co

Mapping

  • Documentの各Fieldのデータ型を定義した情報を表します。
  • Mappingを事前に定義していなくても、ドキュメント格納時に自動的にElasticsearch側でMappingの定義をしてくれます。



以下は実際にドキュメントをどのように格納しているのかを示す用語なので図も交えてまとめました。

Node

f:id:beatsbeats:20210207200138p:plain

  • Elasticsearch が動作するプロセスを指します。
  • 実体は一つのJVMインスタンスです。
  • 一つのサーバー上で一つのNodeが動作するのが基本ですが、複数のNodeを一つのサーバー上で動作させることも可能です。
  • 一意の名(node.name)を持ちます。
  • Nodeは役割ごとに4つの属性を持ちます。(詳細は別記事にて)

Cluster

f:id:beatsbeats:20210207200210p:plain

  • 互いに通信し合う複数のNodeの集合を指します。
  • 一意のCluster名(cluster.name)を持ちます。

Shard

f:id:beatsbeats:20210207200235p:plain

  • Elasticsearchはデータを複数のノードで分散保持することがですが、分散した際のそれぞれのパートを指します。
  • Shardの数は事前(Index作成時)に設定しておく必要があります。(作成後に増やせないので注意)

f:id:beatsbeats:20210207200258p:plain

Replica

f:id:beatsbeats:20210207200319p:plain

  • Shardの複製を指します。
  • 複製元のShardをPrimary Shardと呼び、複製されたShardをReplica Shardと呼びます。
  • Replica Shardは自動的にPrimary Shardとは別のNodeに作成されます。
  • Primary Shardが配置されているNodeの障害時には、ReplicaがPrimaryに昇格します。
  • Replica Shardの数はいつでも変更することが可能です。

参考

book.impress.co.jp

nextpublishing.jp