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

Tablestore:多次元インデックスの作成

最終更新日:Dec 07, 2025

`CreateSearchIndex` メソッドを使用して、データテーブルの多次元インデックスを作成します。データテーブルは複数の多次元インデックスをサポートします。多次元インデックスを作成する際に、クエリしたいフィールドをインデックスに追加します。ルートフィールドや事前ソートなどの高度なオプションも設定できます。

前提条件

  • Tablestore クライアントが初期化済みであること。詳細については、「Tablestore クライアントの初期化」をご参照ください。

  • 次の条件を満たすデータテーブルが作成済みであること。詳細については、「データテーブルの作成」をご参照ください。

    • バージョンの最大数が 1 であること。

    • 生存時間 (TTL) が -1 であるか、データテーブルの更新が無効になっていること。

注意事項

  • 多次元インデックス内のフィールドのデータの型は、データテーブル内のフィールドのデータの型と一致する必要があります。詳細については、「データの型」をご参照ください。

  • 多次元インデックスに -1 以外の生存時間 (TTL) 値を設定するには、データテーブルの `UpdateRow` 操作を無効にする必要があります。多次元インデックスの TTL 値は、データテーブルの TTL 値以下でなければなりません。詳細については、「ライフサイクル管理」をご参照ください。

API

public class CreateSearchIndexRequest implements Request {
    /** データテーブルの名前。 */
    private String tableName;
    /** 多次元インデックスの名前。 */
    private String indexName;
    /** 多次元インデックスのスキーマ。 */
    private IndexSchema indexSchema;
    /**
     * ほとんどの場合、このパラメーターを設定する必要はありません。
     * このパラメーターは、多次元インデックスのスキーマを動的に変更する場合にのみ、セッターメソッドを使用して設定します。このパラメーターは、インデックスの再作成のソースとなる多次元インデックスの名前を指定します。
     */
    private String sourceIndexName;
    /** インデックスデータの TTL (秒単位)。多次元インデックスを作成した後、UpdateSearchIndex 操作を呼び出してこのパラメーターを動的に変更できます。 */
    private Integer timeToLive;
}

public class IndexSchema implements Jsonizable {
    /** インデックスの設定。 */
    private IndexSetting indexSetting;
    /** インデックス内のすべてのフィールドの設定。 */
    private List<FieldSchema> fieldSchemas;
    /** インデックスのカスタム事前ソートメソッド。 */
    private Sort indexSort;
}

パラメーター

多次元インデックスを作成する際には、データテーブル名 (`tableName`)、多次元インデックス名 (`indexName`)、およびインデックススキーマ (`indexSchema`) を指定する必要があります。`indexSchema` には、フィールドスキーマ (`fieldSchemas`)、インデックス設定 (`indexSetting`)、およびインデックスの事前ソート設定 (`indexSort`) が含まれます。次の表にパラメーターを説明します。

パラメーター

説明

tableName

データテーブルの名前。

indexName

検索インデックスの名前。

fieldSchemas

インデックスフィールドのリスト。各 `fieldSchema` には次のパラメーターが含まれます:

  • fieldName (必須):インデックスを作成するフィールドの名前。カラム名です。型:String。

    多次元インデックスのフィールドは、プライマリキー列または属性列にすることができます。

  • fieldType (必須):フィールドのデータの型。型は `FieldType.XXX` 形式で指定します。

    説明
    • 多層の論理関係を持つデータを格納およびクエリするには、Nested 型を使用してデータを格納できます。

    • JSON 形式のデータを格納およびクエリするには、データをデータテーブルに文字列として格納します。その後、多次元インデックスの配列型と Nested 型を使用して、JSON データを柔軟にクエリできます。

    • 地理空間クエリを必要とするアプリケーションでは、Geo-point フィールド型を使用してデータを格納できます。

  • Index (任意):フィールドのインデックスを作成するかどうかを指定します。型:Boolean。

    デフォルト値は true で、転置インデックスまたは空間インデックスがカラムに作成されることを意味します。false に設定すると、このカラムにはインデックスが作成されません。

  • enableHighlighting (任意):まとめとハイライト機能を有効にするかどうかを指定します。型:Boolean。デフォルト値は false です。まとめとハイライト機能を使用するには、このパラメーターを true に設定します。Text 型のフィールドのみがこの機能をサポートします。

  • analyzer (任意):アナライザのタイプ。Text 型のフィールドに対してこのパラメーターを設定できます。このパラメーターを設定しない場合、デフォルトで単語トークン化が使用されます。

  • analyzerParameter (任意):アナライザのパラメーター設定。アナライザのタイプに基づいてパラメーターを設定します。`analyzer` パラメーターを設定した場合は、このパラメーターは必須です。

  • enableSortAndAgg (任意):ソートと集約を有効にするかどうかを指定します。型:Boolean。デフォルト値は true です。

    `enableSortAndAgg` が true に設定されているフィールドでのみソートできます。

    重要

    Text 型のフィールドはソートと集約をサポートしていません。Text フィールドをソートまたは集約するには、Keyword 型の仮想カラムを使用できます。詳細については、「仮想カラム」をご参照ください。

  • isArray (任意):フィールドが配列であるかどうかを指定します。型:Boolean。

    true に設定すると、カラムは配列になります。カラムに書き込まれるデータは、["a","b","c"] のような JSON 配列形式である必要があります。

    Nested 型は配列であるため、`fieldType` が Nested の場合、このパラメーターを設定する必要はありません。

  • subFieldSchemas (任意):Nested 型のフィールドの場合、このパラメーターを使用してサブカラムのインデックスタイプを設定します。型は FieldSchema のリストです。

  • isVirtualField (任意):フィールドが仮想カラムであるかどうかを指定します。型:Boolean。デフォルト値は false です。仮想カラムを使用するには、このパラメーターを true に設定します。

  • sourceFieldName (任意):データテーブル内のソースフィールドの名前。型:String。`isVirtualField` が true に設定されている場合、このパラメーターは必須です。

  • dateFormats (任意):日付フォーマット。型:String。Date 型のフィールドではこのパラメーターは必須です。詳細については、「日時型」をご参照ください。

  • vectorOptions (任意):ベクターフィールドのプロパティ。Vector 型のフィールドではこのパラメーターは必須です。次のパラメーターが含まれます:

    • dataType:ベクターのデータの型。現在、float32 のみがサポートされています。他のデータの型の要件については、チケットを送信してください。

    • dimension:ベクターのディメンション数。Vector フィールドの最大ディメンション数は 4,096 です。

    • metricType:ベクトル間の距離を測定するアルゴリズム。サポートされているアルゴリズム:ユークリッド距離 (euclidean)、コサイン類似度 (cosine)、ドット積 (dot_product)。

      • ユークリッド距離 (euclidean):多次元空間における 2 つのベクトル間の直線距離です。パフォーマンス上の理由から、Tablestore のユークリッド距離アルゴリズムでは、最終的な平方根の計算は実行されません。ユークリッド距離のスコアが大きいほど、2 つのベクトル間の類似度が高いことを示します。

      • コサイン類似度 (cosine):ベクトル空間における 2 つのベクトル間の角度の余弦です。コサイン類似度のスコアが高いほど、2 つのベクトル間の類似度が高いことを示します。これは、テキストデータの類似度を計算するためによく使用されます。

      • ドット積 (dot_product):同じディメンションの 2 つのベクトルの対応する座標を乗算し、その結果を加算します。ドット積のスコアが高いほど、2 つのベクトル間の類似度が高いことを示します。

      距離メトリックアルゴリズムの選択方法については、「距離メトリックアルゴリズム」をご参照ください。

  • jsonType (任意):JSON データのインデックスタイプ。有効な値:OBJECT および NESTED。フィールドタイプが JSON の場合、このパラメーターは必須です。

indexSetting

インデックス設定。`routingFields` 設定が含まれます。

routingFields (任意):カスタムルートフィールド。一部のプライマリキー列をルートフィールドとして選択できます。ほとんどの場合、1 つだけ設定すれば十分です。複数のルートキーを設定した場合、システムはそれらの値を連結して単一の値にします。

indexSort

インデックスの事前ソート設定。`sorters` 設定が含まれます。これを設定しない場合、データはデフォルトでプライマリキーによってソートされます。

説明

`indexSort` パラメーターは、Nested 型を含むインデックスではサポートされていません。事前ソートは実行されません。

sorters (任意):インデックスの事前ソートメソッドのリスト。プライマリキーまたはフィールド値でソートできます。ソートの詳細については、「ソートとページネーション」をご参照ください。

  • PrimaryKeySort はプライマリキーでデータをソートします。次の設定が含まれます:

    order:ソート順。昇順または降順でソートできます。デフォルトは昇順 (SortOrder.ASC) です。

  • FieldSort はフィールド値でデータをソートします。インデックスが作成され、ソートと集約が有効になっているフィールドのみが事前ソートに使用できます。次の設定が含まれます:

    • fieldName:ソート対象のフィールド名。

    • order:ソート順。昇順または降順でソートできます。デフォルトは昇順 (SortOrder.ASC) です。

    • mode:フィールドに複数の値がある場合に使用するソート方法。

sourceIndexName

任意。ほとんどの場合、このパラメーターを設定する必要はありません。

このパラメーターは、多次元インデックスのスキーマを動的に変更する場合にのみ、セッターメソッドを使用して設定します。このパラメーターは、インデックスの再作成のソースとなる多次元インデックスの名前を指定します。

timeToLive

多次元インデックスのライフサイクルの使用方法の詳細については、「ライフサイクル管理」をご参照ください。

デフォルト設定での多次元インデックスの作成

次の例は、多次元インデックスを作成する方法を示しています。インデックスには、Col_Keyword (KEYWORD 型)、Col_Long (LONG 型)、Col_Vector (VECTOR 型) の 3 つのカラムが含まれています。データはデータテーブルのプライマリキーによって事前ソートされ、有効期限はありません。

private static void createSearchIndex(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブル名を設定します。
    request.setTableName("<TABLE_NAME>"); 
    // 多次元インデックス名を設定します。
    request.setIndexName("<SEARCH_INDEX_NAME>"); 
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            // フィールド名と型を設定します。
            new FieldSchema("Col_Keyword", FieldType.KEYWORD), 
            new FieldSchema("Col_Long", FieldType.LONG),
            // ベクター型を設定します。
            new FieldSchema("Col_Vector", FieldType.VECTOR).setIndex(true)
                    // ベクターのディメンションは 4、類似度アルゴリズムはドット積です。
                    .setVectorOptions(new VectorOptions(VectorDataType.FLOAT_32, 4, VectorMetricType.DOT_PRODUCT))
    ));
    request.setIndexSchema(indexSchema);
    // クライアントを呼び出して多次元インデックスを作成します。
    client.createSearchIndex(request); 
}

多次元インデックスの作成と IndexSort の指定

次の例は、多次元インデックスを作成する方法を示しています。インデックスには、Col_Keyword (KEYWORD 型)、Col_Long (LONG 型)、Col_Text (TEXT 型)、Timestamp (LONG 型) の 4 つのカラムが含まれています。データは Timestamp カラムによって事前ソートされます。

private static void createSearchIndexWithIndexSort(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブル名を設定します。
    request.setTableName("<TABLE_NAME>"); 
    // 多次元インデックス名を設定します。
    request.setIndexName("<SEARCH_INDEX_NAME>"); 
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            new FieldSchema("Col_Keyword", FieldType.KEYWORD),
            new FieldSchema("Col_Long", FieldType.LONG),
            new FieldSchema("Col_Text", FieldType.TEXT),
            new FieldSchema("Timestamp", FieldType.LONG)
                    .setEnableSortAndAgg(true)));
    // Timestamp カラムによる事前ソートを設定します。
    indexSchema.setIndexSort(new Sort(
            Arrays.<Sort.Sorter>asList(new FieldSort("Timestamp", SortOrder.ASC))));
    request.setIndexSchema(indexSchema);
    // クライアントを呼び出して多次元インデックスを作成します。
    client.createSearchIndex(request);
}

多次元インデックスの作成とライフサイクルの設定

重要

データテーブルへの更新が無効になっていることを確認してください。

次の例は、多次元インデックスを作成する方法を示しています。インデックスには、Col_Keyword (KEYWORD 型) と Col_Long (LONG 型) の 2 つのカラムが含まれています。多次元インデックスのライフサイクルは 7 日間に設定されています。

// Tablestore SDK for Java 5.12.0 以降を使用してください。
public static void createIndexWithTTL(SyncClient client) {
    int days = 7;
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブル名を設定します。
    request.setTableName("<TABLE_NAME>");
    // 多次元インデックス名を設定します。
    request.setIndexName("<SEARCH_INDEX_NAME>");
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            // フィールド名と型を設定します。
            new FieldSchema("Col_Keyword", FieldType.KEYWORD), 
            new FieldSchema("Col_Long", FieldType.LONG)));
    request.setIndexSchema(indexSchema);
    // 多次元インデックスの TTL を設定します。
    request.setTimeToLiveInDays(days);
    // クライアントを呼び出して多次元インデックスを作成します。
    client.createSearchIndex(request);
}

多次元インデックスの作成と仮想カラムの指定

次の例は、2 つのカラム (Col_Keyword (KEYWORD 型) と Col_Long (LONG 型)) を含む多次元インデックスを作成する方法を示しています。このインデックスには、データテーブルの Col_Keyword カラムにマッピングされる Col_Keyword_Virtual_Long (LONG 型) と、データテーブルの Col_Long カラムにマッピングされる Col_Long_Virtual_Keyword (KEYWORD 型) の 2 つの仮想カラムも含まれています。

private static void createSearchIndex(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブル名を設定します。
    request.setTableName("<TABLE_NAME>"); 
    // 多次元インデックス名を設定します。
    request.setIndexName("<SEARCH_INDEX_NAME>"); 
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
        // フィールド名と型を設定します。
        new FieldSchema("Col_Keyword", FieldType.KEYWORD), 
        // フィールド名と型を設定します。
        new FieldSchema("Col_Keyword_Virtual_Long", FieldType.LONG) 
             // フィールドが仮想カラムであるかどうかを指定します。
            .setVirtualField(true) 
             // 仮想カラムに対応するデータテーブル内のフィールド。
            .setSourceFieldName("Col_Keyword"), 
        new FieldSchema("Col_Long", FieldType.LONG),
        new FieldSchema("Col_Long_Virtual_Keyword", FieldType.KEYWORD)
            .setVirtualField(true)
            .setSourceFieldName("Col_Long")));
    request.setIndexSchema(indexSchema);
    // クライアントを呼び出して多次元インデックスを作成します。
    client.createSearchIndex(request); 
}

多次元インデックス作成時のまとめとハイライトの有効化

次の例は、多次元インデックスを作成する方法を示しています。インデックスには、Col_Keyword (KEYWORD 型)、Col_Long (LONG 型)、Col_Text (TEXT 型) の 3 つのカラムが含まれています。Col_Text カラムでは、まとめとハイライト機能が有効になっています。

private static void createSearchIndexWithHighlighting(SyncClient client) {
    CreateSearchIndexRequest request = new CreateSearchIndexRequest();
    // データテーブル名を設定します。
    request.setTableName("<TABLE_NAME>"); 
    // 多次元インデックス名を設定します。
    request.setIndexName("<SEARCH_INDEX_NAME>"); 
    IndexSchema indexSchema = new IndexSchema();
    indexSchema.setFieldSchemas(Arrays.asList(
            // フィールド名と型を設定します。
            new FieldSchema("Col_Keyword", FieldType.KEYWORD), 
            new FieldSchema("Col_Long", FieldType.LONG),
            // フィールドのまとめとハイライト機能を有効にします。
            new FieldSchema("Col_Text", FieldType.TEXT).setIndex(true).setEnableHighlighting(true)
    ));
    request.setIndexSchema(indexSchema);
    // クライアントを呼び出して多次元インデックスを作成します。
    client.createSearchIndex(request); 
}

FAQ

関連情報