目的
Elasticsearch に関連する用語の内、論理的な概念のものについて整理する。
RDBなど他のデータベースとの違いなどを確認し、用語で混乱することが無いようにする。
Document (ドキュメント)
Elasticsearch に格納する1つの文章の単位。
RDB(リレーショナルデータベース)でいうレコード。
ドキュメントはJSONオブジェクトとして格納され、各ドキュメントを内部で管理するためのIDが付与される。
IDはインデックスへ格納時にユーザにより指定が可能だが、指定しなかった場合でも自動的に付与される。
Field(フィールド)
ドキュメント内で扱われる key:value のペアのこと。
ドキュメントは1つ以上のフィールドから構成される。
Elasticsearch における転置インデックスは、フィールドごとに作成・管理されるため、検索クエリ実行時は基本的にフィールド単位で実行される。
Fieldで扱われるデータ型の種類について
-
文字列(text, keyword)
text 型: 格納時にアナライザ(Analyzer)によって文章を構成する各単語に分割されて、分割された単語ごとに転置インデックスが構成される。
そのため、text 型フィールドに対するクエリは単語を指定して検索する使い方になる。
keyword 型: 格納した文字列を「完全一致」で検索する用途で使う。
(アナライザによる単語分割処理は行われない) -
数値(long, short, integer, floatなど)
数値の大小や、Range(範囲)検索が可能。値の部分はダブルクォートで囲まない。 -
日付(date)
例)
年月日 "2020-12-25"
年月日時分秒 "2020-11-04T18:00:10"
UNIXエポックからのミリ秒 "1587364200000" など
値はダブルクォートで囲む。 -
真偽(boolean)
true or false。値はダブルクォートで囲まない。 -
オブジェクト(object)
object 型というデータ型を用いると、JSONオブジェクト自体をデータ型として扱うことが可能。
{"book":{"title":"ELK", "price":5000}} -
配列(array)
数値 {"id":[3,4,5]}
文字列 {"alfabet":["A","B","C"]}
Object {"students":[{"name":"ken"},{"name":"Ami"}]}
マルチフィールドについて
Elasticsearch5.0以降、マッピング定義で型を明示的に定義していない状態で、文字列をインデックスに格納すると、そのフィールドはデフォルトで text と keyword 型のマルチフィールドとして定義されるようになっている。
この場合、多少インデックス容量が増加するので、用途が明確であれば、text or keyword 型を明示的に定義する方が望ましい。
Index(インデックス)
ドキュメントを保存する場所のこと。
Elasticsearchでは、格納したドキュメントがそのまま格納されるのではなく、検索を効率的に行うためにアナライザや転置インデックス情報などにより、さまざまな形式で保存される。
また、一定数のシャードと呼ばれる単位に分割されて各ノードに分散して格納されている。
Document Type(ドキュメントタイプ)
ドキュメントがどのようなフィールドから構成されているか?
ドキュメントに含まれるフィールドの型や属性情報などのデータ構造が定義されたものをドキュメントタイプと呼ぶ。
Elasticsearchバージョン 5.x までは、1つのインデックスに対して複数のドキュメントタイプを定義することが可能だったが、それ以降のバージョンでは不可となっている。
Mapping(マッピング)
ドキュメントタイプを具体的に定義したものとして、各フィールドのデータ構造やデータ型を記述した情報をマッピングと呼ぶ。
※RDBにおけるスキーマのようなもの
Elasticsearchでは事前にマッピングが定義されていない場合、Elasticsearchが各フィールドのデータ型を推測して自動的にマッピングを定義してからドキュメントを格納してくれる。