Elasticsearchとは、リアルタイムにデータの検索や分析ができる分散型の検索エンジンです。ここではElasticsearchの特徴を説明しましたが、今回はElasticsearchで使われる用語について説明していきたいと思います。
Elasticsearchはデータを格納するプロダクトですが、一般的なMySQLやPostgreSQLなどのリレーショナルデータベースとは概念がことなるため、システムの基礎として概念の理解と用語の理解をしていきたいと思います。
基本概念を理解する
論理的な概念・用語について
ドキュメント
ドキュメントは、Elasticsearch内のデータの最小単位で、JSON形式でデータが格納されており、一般的なRDBでいうところの行に相当します。
例えば、ブログの1記事や、ユーザーのプロフィール情報などがドキュメントとして考えられます。
ドキュメントの例:
{ "id": "12345", "name": "田中 太郎", "email": "tanaka@example.com", "address": { "city": "東京", "postcode": "100-0001" }, "purchaseHistory": [ { "itemId": "A001", "itemName": "ノートパソコン", "purchaseDate": "2023-10-01" }, { "itemId": "A002", "itemName": "スマートフォン", "purchaseDate": "2023-08-15" } ] }
フィールド
フィールドは、ドキュメント内の特定の情報を指します。例えば、ユーザーのドキュメントがあった場合、「名前」や「年齢」といった情報がフィールドとして扱われます。
また、Elasticsearchのフィールドは、多様なデータ型を持つことが可能で、それぞれのデータ型は、特定の種類のデータの保存と検索の最適化を行います。以下に、主要なデータ型の一部を紹介します。
詳細を知りたい方は本家の「Field data types」を参照してください。
データ型 | 説明 |
---|---|
text | 主に全文検索に使用。アナライザを適用してテキストをトークンに分割してインデックス化します。 |
keyword | テキストをそのままの形でインデックス化し、完全一致検索や集約に適しています。 |
int, long | 整数や長整数を表すデータ型。 |
float, double | 浮動小数点や倍精度浮動小数点を表すデータ型。 |
date | 日付や時刻のデータ。特定のフォーマットで日付を解析してインデックス化します。 |
boolean | true または false の値を持つデータ型です。 |
binary | 任意のバイナリデータをBase64エンコード形式で保存するデータ型。 |
object | JSONオブジェクトのようなネストされたデータ構造を持つフィールドのデータ型。 |
配列 (implicit) | 1つのフィールドが複数の値を持つ場合に使用。Elasticsearchは明示的な「配列データ型」を持っていませんが、任意のフィールドに複数の値を持たせることができます。 |
geo_point | 地理的な位置情報を表す緯度と経度の点。 |
geo_shape | 複雑な地理的形状を表すデータ型。 |
これらはElasticsearchのデータ型の一部に過ぎませんが、実際の用途に応じて適切なデータ型を選択することで、効率的なデータの保存と検索を実現することができます。
マッピング
マッピングは、ドキュメントのフィールドの型や特徴を定義するためのものです。例えば、フィールドがテキスト型か、日付型を指定することができます。
以下はマッピングの例となります。
{ "mappings": { "properties": { "id": { "type": "keyword" }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "email": { "type": "keyword" }, "address": { "properties": { "city": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "postcode": { "type": "keyword" } } }, "join_date": { "type": "date", "format": "yyyy-MM-dd" } } } }
id
,email
,postcode
: これらのフィールドはkeyword
型として定義されており、文字列の完全一致検索や集約に適しています。name
とaddress.city
: これらのフィールドはtext
型として定義されていて、全文検索に適しています。また、fields
の部分でサブフィールドとしてkeyword
型も定義されているため、完全一致検索も可能です。address
: ネストされたオブジェクトの例。city
とpostcode
の2つのサブフィールドを持っています。join_date
:date
型として定義されており、特定のフォーマット(この場合はyyyy-MM-dd
)で日付を解析・インデックス化します。
このように、マッピングを通じて各フィールドのデータ型や特性を定義することで、Elasticsearchはデータの保存と検索を効率的に行います。
物理的な概念・用語について
ノード(Node)
Elasticsearchのインスタンスのことを指します。一つのサーバーに一つのノードが存在することが一般的ですが、複数のノードで構成させることも可能です。
クラスタ(Cluster)
クラスタは、複数のノードが組み合わさったものです。クラスタを構成することで、データの冗長性や処理能力を向上させることができます。
シャード(Shard)
インデックスを小さな単位に分割するためのものです。これにより、大量のデータを複数のノードに分散して保存することができます。
レプリカ(Replica)
シャードのコピーを指します。データの冗長性を確保し、検索性能を向上させるために使用されます。
オリジナルのシャードをプライマリシャード、複製されるシャードをレプリカシャードと呼び、同じノードに配置されないようにしてノードが障害で停止した場合などは複製されることで可用性を高める効果があります。
Elasticsearchは、これらの概念を基にして、高速な検索や分析を実現しています。
オプション
ElasticsearchとRDBの対応関係
Elasticsearchの概念 | RDBの概念 | 説明 |
---|---|---|
ドキュメント | レコード/行 | データの基本単位。RDBでは行、ElasticsearchではJSONドキュメントとして保存。 |
フィールド | カラム/列 | データの属性や特性。RDBのカラムに対応。 |
インデックス | テーブル | 同種のドキュメント/レコードを保存するための場所。 |
マッピング | スキーマ | データの構造や型を定義。RDBのスキーマとElasticsearchのマッピングがこれに対応。 |
Elasticsearchの論理概念、物理概念の関係性を表した図
以上Elasticsearchを構成する論理概念、物理概念の説明でした。
ザックリの説明となりますが、この基礎を抑えているだけでもシステム開発でElasticsearchを触るときに理解するスピードが向上すると思います。
コメント