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

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

最終更新日:Nov 30, 2025

CreateSearchIndex メソッドを使用して、データテーブルに 1 つ以上の多次元インデックスを作成できます。インデックスを作成する際には、クエリ対象のフィールドを指定する必要があり、カスタムルーティングキーや事前ソートなどの高度なオプションも設定できます。

前提条件

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

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

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

    • 生存時間 (TTL) が -1 であるか、データテーブルの更新が禁止されていること。

注意事項

多次元インデックスを作成する際、フィールドのデータの型は、データテーブル内の対応するフィールドのデータの型と一致している必要があります。

パラメータ

多次元インデックスを作成するには、テーブル名 (TableName)、多次元インデックス名 (IndexName)、およびインデックススキーマ (IndexSchema) を指定する必要があります。IndexSchema には、FieldSchemas (フィールド設定)、IndexSetting (インデックス設定)、および IndexSort (事前ソート設定) が含まれます。次の表に、これらのパラメーターの詳細を示します。

パラメータ

説明

TableName

データテーブルの名前。

IndexName

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

FieldSchemas

FieldSchema オブジェクトのリスト。各 FieldSchema には、次のパラメーターが含まれます。

  • FieldName (必須):多次元インデックスに追加するフィールドの名前。これはカラム名です。型は String です。

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

  • FieldType (必須):フィールドのデータの型。型は FieldType.XXX です。

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

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

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

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

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

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

  • EnableSortAndAgg (任意):フィールドのソートと集約を有効にするかどうかを指定します。型は Boolean です。

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

    重要

    Nested 型のフィールドでは、ソートと集約はサポートされていません。ただし、Nested フィールド内のサブカラムに対しては、ソートと集約を有効にできます。

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

  • SourceFieldNames (任意):データテーブル内のフィールドの名前。型は String です。

    重要

    IsVirtualField を true に設定した場合は、このパラメーターを設定する必要があります。

  • DateFormats (任意):日付フォーマット。型は String です。詳細については、「日付と時刻の型」をご参照ください。

    重要

    フィールドタイプが Date の場合は、このパラメーターを設定する必要があります。

IndexSetting

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

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

IndexSort

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

説明

IndexSort は、Nested フィールドを含むインデックスではサポートされていません。これらのインデックスには事前ソートがありません。

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

  • PrimaryKeySort:プライマリキーによるソート。次の設定が含まれます:

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

  • FieldSort:フィールド値によるソート。次の設定が含まれます:

    インデックスが作成され、ソートと集約が有効になっているフィールドのみが事前ソートに使用できます。

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

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

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

TimeToLive

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

次の例では、多次元インデックスを作成する方法を示します。この多次元インデックスには、Keyword_type_col (Keyword)、Long_type_col (Long)、Text_type_col (Text) の 3 つのカラムが含まれています。ソートと集約が有効になっています。

/// <summary>
/// Keyword_type_col、Long_type_col、Text_type_col の 3 つの属性列を含む多次元インデックスを作成します。型はそれぞれ Keyword (非トークン化文字列)、Long (整数)、Text (トークン化文字列) に設定されます。
/// </summary>
/// <param name="otsClient"></param>
public static void CreateSearchIndex(OTSClient otsClient)
{
    // テーブル名と多次元インデックス名を設定します。
    CreateSearchIndexRequest request = new CreateSearchIndexRequest(TableName, IndexName);
    List<FieldSchema> FieldSchemas = new List<FieldSchema>() {
        new FieldSchema(Keyword_type_col,FieldType.KEYWORD){ // フィールド名とフィールドタイプを設定します。
            index =true, // インデックス作成を有効にします。
            EnableSortAndAgg =true // ソートと集約を有効にします。
        },
        new FieldSchema(Long_type_col,FieldType.LONG){ index=true,EnableSortAndAgg=true},
        new FieldSchema(Text_type_col,FieldType.TEXT){ index=true}
    };
    request.IndexSchame = new IndexSchema()
    {
        FieldSchemas = FieldSchemas
    };
    // クライアントを呼び出して多次元インデックスを作成します。
    CreateSearchIndexResponse response = otsClient.CreateSearchIndex(request);
    Console.WriteLine("Searchindex is created: " + IndexName);
}

IndexSort を指定した多次元インデックスの作成

次の例では、多次元インデックスを作成する方法を示します。この多次元インデックスには、Keyword_type_col (Keyword)、Long_type_col (Long)、Text_type_col (Text) の 3 つのカラムが含まれています。データは Long_type_col カラムで事前ソートされます。

/// <summary>
/// Keyword_type_col、Long_type_col、Text_type_col の 3 つの属性列を含む多次元インデックスを作成します。型はそれぞれ Keyword (非トークン化文字列)、Long (整数)、Text (トークン化文字列) に設定されます。
/// </summary>
/// <param name="otsClient"></param>
public static void CreateSearchIndexWithIndexSort(OTSClient otsClient)
{
    // テーブル名と多次元インデックス名を設定します。
    CreateSearchIndexRequest request = new CreateSearchIndexRequest(TableName, IndexName);
    List<FieldSchema> FieldSchemas = new List<FieldSchema>() {
        new FieldSchema(Keyword_type_col,FieldType.KEYWORD){ // フィールド名とフィールドタイプを設定します。
            index =true, // インデックス作成を有効にします。
            EnableSortAndAgg =true // ソートと集約を有効にします。
        },
        new FieldSchema(Long_type_col,FieldType.LONG){ index=true,EnableSortAndAgg=true},
        new FieldSchema(Text_type_col,FieldType.TEXT){ index=true}
    };
    request.IndexSchame = new IndexSchema()
    {
        FieldSchemas = FieldSchemas,
        // Long_type_col カラムで事前ソートします。Long_type_col カラムはインデックスが作成され、EnableSortAndAgg が有効になっている必要があります。
        IndexSort = new DataModel.Search.Sort.Sort()
        {
            Sorters = new List<DataModel.Search.Sort.ISorter>
            {
                new DataModel.Search.Sort.FieldSort(Long_type_col, DataModel.Search.Sort.SortOrder.ASC)
            }
        }
    };

    CreateSearchIndexResponse response = otsClient.CreateSearchIndex(request);
    Console.WriteLine("Searchindex is created: " + IndexName);
}

日付列と仮想カラムを含む多次元インデックスの作成

次の例では、多次元インデックスを作成する方法を示します。この多次元インデックスには、pk0 (Keyword)、pk1 (Long)、date_col (Date)、geo_col (Geo-point)、col0_v1 (Text) フィールドが含まれています。仮想カラム col0_v1 のソースカラムは col0 です。結果は pk1 カラムの昇順でソートされます。

/// <summary>
/// 日付列と仮想カラムを含む多次元インデックスを作成します。
/// </summary>
/// <param name="otsClient"></param>
public static void CreateSearchIndex(OTSClient otsClient)
{
    List<FieldSchema> fieldSchemas = new List<FieldSchema> {
        new FieldSchema("pk0", FieldType.KEYWORD)
        {
            index = true,
            EnableSortAndAgg = true
        },

        new FieldSchema("pk1", FieldType.LONG)
        {
            index = true,
            EnableSortAndAgg = true
        },

        new FieldSchema("date_col", FieldType.DATE)
        {
            index = true,
            DateFormats = new List<string>(){
                "yyyy-MM-dd'T'HH:mm:ss.SSSSSS",
                "yyyy-MM-dd'T'HH:mm:ss.SSS"
            }
        },

        new FieldSchema("geo_col", FieldType.GEO_POINT)
        {
            index = true,
            EnableSortAndAgg = true
        },

        new FieldSchema("col0_v1", FieldType.TEXT)
        {
            index = true,
            Analyzer = Analyzer.Split,
            AnalyzerParameter = new SingleWordAnalyzerParameter(true, true),
            IsVirtualField = true,
            SourceFieldNames = new List<string> { "col0" }
        },
    };

    CreateSearchIndexRequest request = new CreateSearchIndexRequest(TableName, IndexName);
    request.IndexSchame = new IndexSchema()
    {
        FieldSchemas = fieldSchemas,
        IndexSort = new Sort(new List<ISorter> { new FieldSort("pk1", SortOrder.ASC) })
    };
    request.TimeToLive = -1;

    otsClient.CreateSearchIndex(request);
}

FAQ

関連情報