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

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

最終更新日:May 01, 2026

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 (オプション)トークナイザーの種類です。FieldType が Text の場合にのみ適用されます。デフォルト:文字トークン化。

  • EnableSortAndAgg (オプション):フィールドのソートおよび集約を有効にするかどうかを指定します。型:Boolean。この値を true に設定したフィールドのみがソートをサポートします。Nested 型はソートおよび集約をサポートしませんが、Nested フィールド内のサブカラムはサポートします。

  • IsVirtualField (オプション):フィールドが仮想カラムかどうかを指定します。型:Boolean。デフォルト:false。仮想カラムの場合にのみこのパラメーターを設定します。

  • SourceFieldNames (オプション):データテーブル内のソースカラム名です。型:String。IsVirtualField が true の場合に必須です。

  • DateFormats (オプション):日付形式です。型:String。FieldType が Date の場合に必須です。詳細については、「日時型」をご参照ください。

IndexSetting

インデックス設定です。以下のパラメーターが含まれます。

RoutingFields (オプション):カスタムルートフィールドです。1 つ以上のプライマリキー列をルートフィールドとして選択します。ほとんどのケースではルートフィールドを 1 つ指定すれば十分です。複数のルートキーを設定した場合、システムはそれらの値を連結して単一の値として扱います。同じルートフィールド値を持つレコードは、同じデータパーティションにインデックスされます。

IndexSort

インデックスの事前ソート設定です。指定しない場合、データはデフォルトでプライマリキーによってソートされます。Nested フィールドを含むインデックスは IndexSort をサポートしません。

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

  • PrimaryKeySort:プライマリキーでソートします。Order パラメーターを設定して、昇順または降順を指定します。デフォルト:昇順 (DataModel.Search.Sort.SortOrder.ASC)。

  • FieldSort:フィールド値でソートします。ソートおよび集約が有効になっているインデックスフィールドのみを事前ソートに使用できます。以下の設定が含まれます。

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

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

    • Mode:フィールドに複数の値が含まれる場合のソートモードです。

TimeToLive

オプション。多次元インデックス内のデータの生存時間 (TTL) を秒単位で指定します。デフォルト:-1 (データは期限切れになりません)。最小値:86400 秒 (1 日)。保持期間が設定された TTL を超えると、期限切れのデータは自動的にクリーンアップされます。

デフォルト設定で検索インデックスを作成する

Keyword_type_col (Keyword)、Long_type_col (Long)、Text_type_col (Text) の 3 つのフィールドを持つ多次元インデックスを作成し、Keyword フィールドおよび Long フィールドでソートおよび集約を有効にします。

/// <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 (トークン化文字列)。
/// Long_type_col の値で結果を昇順に事前ソートします。
/// </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 で事前ソート (昇順)。フィールドの 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) の 5 つのフィールドを持つ多次元インデックスを作成します。仮想カラム col0_v1 は、ソースカラム col0 にマッピングされます。結果は pk1 の値で昇順に事前ソートされます。

/// <summary>
/// 日付フィールドおよび仮想カラムを含む多次元インデックスを作成します。
/// 仮想カラム col0_v1 は、データテーブル内のソースカラム col0 にマッピングされます。
/// </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" }  // ソースカラム 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);
}

よくある質問

次のステップ