OpenSearch は、データを効率的に整理して取得するためにインデックスを使用します。3 つのインデックスタイプ (転置インデックス、フォワードインデックス、サマリー) を理解すると、検索速度、フィルタリング性能、ストレージコストのバランスの取れたスキーマを設計できます。
OpenSearch は、データ取得を高速化するためにインデックスを作成します。各ドキュメントは複数のフィールドで構成され、各フィールドには一連のタームが含まれます。OpenSearch は、タームとドキュメントのマッピング方法に基づいて、次の 3 つのインデックスタイプをサポートします:
-
転置インデックス:タームを、それを含むドキュメントにマッピングします (ターム → DocID リスト)。転置インデックスは、全文検索およびキーワード検索に使用します。クエリキーワードが与えられると、データセット全体をスキャンせずに、インデックスが一致するすべてのドキュメントを返します。
たとえば、2 つのドキュメントからなるデータセットの場合:
ドキュメント 1:"the quick brown fox"
ドキュメント 2:"the lazy brown dog"
転置インデックスは、各タームを、それが出現するドキュメントにマッピングします:
ターム
ドキュメント
the
Doc1、Doc2
quick
Doc1
brown
Doc1、Doc2
fox
Doc1
lazy
Doc2
dog
Doc2
クエリ "brown" が与えられると、転置インデックスはすべてのドキュメントをスキャンすることなく、直ちに Doc1 と Doc2 を返します。
OpenSearch のスキーマ設定では、転置インデックスフィールドは
indexフィールドと呼ばれます。 -
フォワードインデックス:DocID を、そのドキュメントのフィールド値にマッピングします (DocID → フィールド値)。クエリが転置インデックスで一致するドキュメントを特定した後、フォワードインデックスは DocID に基づいてそれらのドキュメントのフィールド値を効率的に取得します。フォワードインデックスは、取得後の処理 (統計、ソート、フィルタリング) に使用します。
OpenSearch のスキーマ設定では、フォワードインデックスフィールドは
attributeフィールドと呼ばれます。属性には次の 2 つの種類があります:単一値属性:ドキュメントごとに 1 つの値を保持し、(STRING 型を除き) 固定の格納長を持つため参照効率が高く、更新もサポートします。
複数値属性:ドキュメントごとに可変個の値を保持します。長さが固定ではないため、参照効率は単一値属性より低く、更新はサポートされません。
DPI エンジンは、フォワードインデックスフィールド向けに次の基本データ型をサポートします:
タイプ
説明
INT8
8 ビット符号付き整数
UINT8
8 ビット符号なし整数
INT16
16 ビット符号付き整数
UINT16
16 ビット符号なし整数
INTEGER
32 ビット符号付き整数
UINT32
32 ビット符号なし整数
INT64
64 ビット符号付き整数
UINT64
64 ビット符号なし整数
FLOAT
32 ビット浮動小数点数
DOUBLE
64 ビット浮動小数点数
STRING
文字列型
各単一値型には、対応する複数値のバリアントがあります。たとえば、
multi_int8はINT8の複数値バリアントであり、multi_stringはSTRINGの複数値バリアントです。 -
サマリー:各ドキュメントの複数フィールドのスナップショットを、DocID によってマッピングして格納します。サマリーは構造としてはフォワードインデックスに似ていますが、フィルタリングやソートではなく、表示目的で複数フィールドをまとめて保持するように設計されています。
サマリーは、表示対象となる最終的なドキュメントセットに対してのみ取得されます。1 回のクエリで多数の大きなサマリーを取得するのは非効率なため、主な取得フェーズでは取得されません。
ストレージサイズを削減するため、DPI エンジンはサマリー圧縮をサポートします。スキーマでサマリー圧縮を設定すると、エンジンはサマリーデータを格納前に zlib で圧縮し、読み取り時に展開してから結果を返します。