すべてのプロダクト
Search
ドキュメントセンター

Lindorm:インデックステーブルの作成

最終更新日:Jan 14, 2025

Lindorm GanosBaseは、複数の組み込み空間インデックスを提供します。フロントエンドで時空間データを挿入し、作成するインデックスを指定するだけで済みます。 HBaseテーブルのキーと値のペアを設計または構築する必要はありません。インデックステーブルにデータを挿入する前に、インデックステーブルのスキーマを指定します。

Lindorm GanosBaseは、さまざまなクエリシナリオでの要件を満たすために、5種類のインデックスを提供します。ビジネス要件に基づいて、1つ以上の種類のインデックスを作成できます。たとえば、ビジネスシナリオに範囲クエリのみが存在する場合は、Z2インデックスのみを作成する必要があります。

IDインデックス

IDインデックスは、ジオメトリのフィーチャID(FID)を使用してデータをクエリするシナリオに適しています。ジオメトリのFIDは一意である必要があります。

Z2およびXZ2インデックス

Z2およびXZ2インデックスは、ジオフェンスクエリや範囲クエリなどの空間クエリに適しています。 Z2インデックスはポイントオブジェクトのクエリに使用され、XZ2インデックスはラインオブジェクトとポリゴンオブジェクトのクエリに使用されます。

Z3、XZ3、およびXZ2Tインデックス

Z3、XZ3、およびXZ2Tインデックスは、特定の空間範囲と期間における履歴軌跡データのクエリなど、時空間クエリに適しています。 Z3インデックスはポイントオブジェクトのクエリに使用されます。 XZ3およびXZ2Tインデックスは、ラインオブジェクトとポリゴンオブジェクトのクエリに使用されます。軌跡ラインモデルに基づくクエリの場合、XZ2Tインデックスはクエリ効率の向上に効果的です。

XYZインデックス

XYZインデックスは3次元インデックスです。ディメンションは、経度、緯度、高度情報です。 XYZインデックスは、ポイントオブジェクトのクエリにのみ使用されます。

属性インデックス

属性インデックスは、他の属性をクエリするために使用されます。

インデックスの作成手順

インデックスを作成するには、次の手順を実行します。

  1. 空間データ型または時空間データ型を示すSimpleFeatureTypeを指定します。

    1. スキーマの名前を指定します。スキーマはインデックステーブルを参照します。

    2. スキーマの内容を指定します。コンテンツには、属性、ジオメトリ、日付列などの列の定義が含まれます。

    3. その他にも、次の設定を指定できます。

      1. 圧縮方式を指定します。

      2. Tiny Well-Known Binary(TWKB)形式を使用するかどうかを指定します。

      3. 列のインデックスを作成するためのパラメータを指定します。

  2. 指定した空間データ型または時空間データ型に基づいてオブジェクトを作成します。

インデックスの作成例

ビジネス要件に基づいて、1つ以上の種類のインデックスを作成できます。たとえば、ビジネスシナリオに範囲クエリのみが存在する場合は、Z2インデックスのみを作成する必要があります。デフォルトでは、5種類のインデックスが作成されます。これにより、すべてのクエリシナリオで優れたクエリパフォーマンスが提供されますが、より多くのストレージスペースが占有されます。ストレージの使用量を削減する場合は、クエリシナリオに適した1つ以上の種類のインデックスを作成できます。 Lindorm GanosBaseは組み込みのヒントを提供します。 SimpleFeatureTypeを指定するときに、ヒントを使用してインデックスを指定できます。次の構文を使用できます。

// sftはSimpleFeatureTypeのインスタンスオブジェクトを指定します。
sft.getUserData().put("geomesa.indices.enabled", "{index_name}:{col1}:{col2}:...,{index_name}:{col}");
  • index_nameの有効な値は、id、attr、z2、z3、xz2、xz3、xyzです。

  • colパラメータは、SimpleFeatureTypeで指定された列を指定します。

  • 1つ以上のインデックスを作成できます。インデックスはコンマ(,)で区切ります。

  • インデックスに複数の列を追加する場合は、インデックスと列名をコロン(:)で区切ります。

次の例では、Z3インデックスと属性インデックスが作成されます。 Z3インデックスはstart列とdtg列に作成されます。 Z3インデックスはend列とdtg列にも作成されます。属性インデックスはname列とdtg列に作成されます。

sft.getUserData().put("geomesa.indices.enabled", "z3:start:dtg,z3:end:dtg,attr:name:dtg");

時空間セカンダリインデックス

Lindorm GanosBaseは、Lindormでサポートされているネイティブセカンダリインデックスに基づいて、時空間セカンダリインデックスを提供します。従来のセカンダリインデックステーブルは、プライマリテーブルの属性列に構築されます。シリアル化された時空間属性列に構築されたセカンダリインデックスは効果がありません。セカンダリインデックスを有効にするには、エンコードされた時空間データ列にセカンダリインデックスを作成する前に、エンコードされた時空間データ列をプライマリテーブルに追加します。エンコードされた時空間データ列には、時空間属性の空間充填曲線のエンコードされた値が格納されます。次の図は、セカンダリインデックスのストレージ構造の例を示しています。

この例では、IDを行キーとして使用するプライマリテーブルにz3という名前の時空間インデックスキー列が作成され、z3時空間インデックスキー列にセカンダリインデックステーブルが作成されます。デフォルトでは、セカンダリインデックステーブルに冗長な列は存在しません。冗長列は将来のバージョンでサポートされる予定です。

時空間セカンダリインデックスの作成例

プライマリテーブルを作成するときに、作成する時空間セカンダリインデックスのタイプを指定します

指定されたSimpleFeatureType(次の例ではsft)のuserDataパラメータを指定します。

// sftはSimpleFeatureTypeのインスタンスオブジェクトを指定します。
sft.getUserData().put("geomesa.secondary.enabled","true");
sft.getUserData().put("geomesa.primary.index","id");
sft.getUserData().put("geomesa.indices.enabled","id,z3");

createSchema操作を呼び出してテーブルを作成すると、プライマリテーブルとセカンダリインデックステーブルが生成されます。前の図は、プライマリテーブルとセカンダリインデックステーブルのストレージ構造を示しています。

既存のプライマリテーブルにセカンダリインデックスを作成する

LindormDataStore.createIndexメソッドを呼び出して、作成済みでgeomesa.secondary.enabledパラメータがtrueに設定されているプライマリテーブルにセカンダリインデックスを作成します。

String index = "attr:dtg";
lindormDS.createIndex(schemaName, index);

履歴データを同期している間は、インデックステーブルを作成できないことに注意してください。