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

Tablestore:検索インデックスを作成する

最終更新日:May 07, 2025

CreateSearchIndex オペレーションを呼び出して、データテーブルに 1 つ以上の検索インデックスを作成できます。検索インデックスを作成する際に、クエリを実行するフィールドを検索インデックスに追加し、検索インデックスの詳細設定を構成できます。たとえば、ルーティングキーと事前ソート設定を構成できます。

前提条件

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

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

    • max versions パラメーターが 1 に設定されていること。

    • time to live(TTL)が -1 に設定されているか、データテーブルの更新が禁止されていること。

使用方法

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

  • 検索インデックスの TimeToLive パラメーターを -1 以外の値に設定するには、検索インデックスが作成されるデータテーブルで UpdateRow オペレーションが禁止されていることを確認してください。検索インデックスの TimeToAlive パラメーターの値は、データテーブルの TimeToAlive パラメーターの値以下である必要があります。詳細については、「検索インデックスの TTL を指定する」をご参照ください。

パラメーター

検索インデックスを作成する際は、TableName、IndexName、および IndexSchema パラメーターを構成する必要があります。また、IndexSchema パラメーターで FieldSchemas、IndexSetting、および IndexSort パラメーターも構成する必要があります。次の表に、上記のパラメーターについて説明します。

パラメーター

説明

TableName

データテーブルの名前。

IndexName

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

FieldSchemas

フィールドスキーマのリスト。各フィールドスキーマで、以下のパラメーターを構成します。

  • FieldName(必須): 検索インデックスのフィールドの名前。値は列名として使用されます。型:文字列。

    検索インデックスのフィールドは、データテーブルのプライマリキー列または属性列です。

  • FieldType(必須): フィールドの型。tablestore.FieldType_XXX 形式で型を指定します。詳細については、「データ型」をご参照ください。

  • Array(オプション): 値が配列かどうかを指定します。型:ブール値。

    このパラメーターを true に設定すると、フィールドはデータを配列として保存します。フィールドに書き込まれるデータは JSON 配列である必要があります。例:["a","b","c"]。

    ネストされた値は配列です。FieldType パラメーターを Nested に設定した場合、このパラメーターを構成する必要はありません。

  • Index(オプション): インデックス作成を有効にするかどうかを指定します。型:ブール値。

    デフォルト値:true。true の値は、Tablestore が転置インデックスまたは時空間インデックススキーマを使用してフィールドにインデックスを作成することを指定します。false の値は、フィールドのインデックス作成が無効になっていることを指定します。

  • Analyzer(オプション): 使用するアナライザの型。FieldType パラメーターを Text に設定した場合、このパラメーターを構成できます。このパラメーターを構成しない場合、デフォルトのアナライザ型である文字トークン化が使用されます。詳細については、「トークン化」をご参照ください。

  • EnableSortAndAgg(オプション): ソートと集約を有効にするかどうかを指定します。型:ブール値。

    フィールドのソート機能を有効にする場合は、EnableSortAndAgg パラメーターを true に設定します。詳細については、「ソートとページング」をご参照ください。

    重要

    ネストされたフィールドは、ソートと集約をサポートしていません。ネストされたフィールドのサブフィールドは、ソートと集約をサポートしています。

  • Store(オプション): フィールドの値を検索インデックスに保存するかどうかを指定します。型:ブール値。

    Store パラメーターを true に設定すると、データテーブルをクエリすることなく、検索インデックスからフィールドの値を読み取ることができます。これにより、クエリのパフォーマンスが向上します。

  • DateFormats(オプション): 日付の形式。型:文字列。FieldType パラメーターを Date に設定した場合、このパラメーターを構成する必要があります。詳細については、「日付データ型」をご参照ください。

  • EnableHighlighting (オプション): ハイライト機能を有効にするかどうかを指定します。型: ブール値。デフォルト値: false。これは、フィールドのハイライト機能が無効になっていることを指定します。このパラメーターを true に設定すると、ハイライト機能を使用できます。Text フィールドのみがハイライト機能をサポートしています。詳細については、「クエリ結果をハイライト表示する」をご参照ください。

  • VectorOptions (オプション): ベクターフィールドのプロパティ。FieldType パラメーターを Vector に設定した場合、このパラメーターを構成する必要があります。ベクターフィールドには、以下のプロパティが含まれています。

    • DataType: ベクター型。float32 のみサポートされています。他のベクター型を使用する場合は、チケットを送信 してください。

    • Dimension: ベクター次元。ベクターフィールドの最大次元数は 2,048 です。

    • MetricType: ベクター間の距離を測定するために使用するアルゴリズム。有効な値:euclidean、cosine、および dot_product。

      • euclidean: 多次元空間における 2 つのベクター間の最短パスを測定するユークリッド距離アルゴリズム。パフォーマンスを向上させるため、Tablestore のユークリッド距離アルゴリズムは最終的な平方根計算を実行しません。ユークリッド距離アルゴリズムを使用して得られた値が大きいほど、2 つのベクター間の類似性が高いことを示します。

      • cosine: ベクター空間における 2 つのベクター間の角度の余弦を計算するコサイン類似度アルゴリズム。コサイン類似度アルゴリズムを使用して得られた値が大きいほど、2 つのベクター間の類似性が高いことを示します。ほとんどの場合、このアルゴリズムはテキストデータ間の類似性を計算するために使用されます。

      • dot_product: 同じ次元の 2 つのベクターの対応する座標を乗算し、積を加算するドット積アルゴリズム。ドット積アルゴリズムを使用して得られた値が大きいほど、2 つのベクター間の類似性が高いことを示します。

      詳細については、「ベクターの距離測定アルゴリズム」をご参照ください。

IndexSetting

検索インデックスの設定。RoutingFields パラメーターの設定を含みます。

RoutingFields(オプション): カスタムルーティングフィールド。特定のプライマリキー列をルーティングフィールドとして指定できます。ほとんどの場合、ルーティングフィールドは 1 つだけ指定する必要があります。複数のルーティングフィールドを指定すると、システムはルーティングフィールドの値を 1 つの値に連結してパーティションキーとして使用します。

Tablestore は、ルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。ルーティングフィールドの値が同じデータは、同じパーティションに分散されます。

IndexSort

検索インデックスの事前ソート設定。Sorters パラメーターの設定を含みます。IndexSort パラメーターを空のままにすると、フィールド値はプライマリキーでソートされます。

説明

ネストされたフィールドを含む検索インデックスの事前ソート設定はスキップできます。

Sorters(必須): 検索インデックスの事前ソート方法。有効な値:PrimaryKeySort および FieldSort。詳細については、「ソートとページング」をご参照ください。

  • PrimaryKeySort: プライマリキーでデータをソートします。Sorters パラメーターを PrimaryKeySort に設定した場合、以下のパラメーターを構成する必要があります。

    Order: ソート順。データは昇順または降順でソートできます。デフォルトでは、データは昇順でソートされます。

  • FieldSort: フィールド値でデータをソートします。Sorters パラメーターを FieldSort に設定した場合、以下のパラメーターを構成する必要があります。

    説明

    インデックスが作成され、EnableSortAndAgg パラメーターが true に設定されているフィールドのみを事前ソートできます。

    • FieldName: データのソートに使用する値を持つ列の名前。

    • Order: ソート順。データは昇順または降順でソートできます。デフォルトでは、データは昇順でソートされます。

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

TimeToLive

(オプション)検索インデックスのデータの保存期間。単位:秒。デフォルト値:-1。

このパラメーターの値は 86,400 以上である必要があります。値 86,400 は 1 日を指定します。このパラメーターを -1 に設定することもできます。これは、データの有効期限が切れないことを指定します。

データの保存期間が TimeToLive パラメーターの値を超えると、データの有効期限が切れます。Tablestore は、期限切れのデータを自動的に削除します。

検索インデックスの Time To Live(TTL)機能の使用方法については、「検索インデックスの TTL を指定する」をご参照ください。

デフォルト設定を使用して検索インデックスを作成する

次のサンプルコードは、デフォルト設定を使用して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の col_keyword フィールド、Long 型の col_long フィールド、および Vector 型の col_vector フィールドで構成されています。

func createSearchIndex(client *tablestore.TableStoreClient) {
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>"
    request.IndexName = "<SEARCH_INDEX_NAME>"
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: []*tablestore.FieldSchema{
            {
                FieldName:        proto.String("col_keyword"),
                FieldType:        tablestore.FieldType_KEYWORD, // 文字列型。
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {
                FieldName:        proto.String("col_long"),
                FieldType:        tablestore.FieldType_LONG, // Long 型。
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {
                FieldName: proto.String("col_vector"),
                FieldType: tablestore.FieldType_VECTOR, // Vector 型。
                Index:     proto.Bool(true),
                VectorOptions: &tablestore.VectorOptions{
                    VectorDataType:   tablestore.VectorDataType_FLOAT_32.Enum(),
                    Dimension:        proto.Int32(4), // ベクター次元数を 4 に設定し、ベクターの距離測定アルゴリズムをドット積アルゴリズムに設定します。
                    VectorMetricType: tablestore.VectorMetricType_DOT_PRODUCT.Enum(),
                },
            },
        },
    }
    _, err := client.CreateSearchIndex(request)
    if err != nil {
        fmt.Println("Failed to create searchIndex with error:", err) // 検索インデックスの作成に失敗しました。エラー:
        return
    }
}

IndexSort パラメーターを指定して検索インデックスを作成する

次のサンプルコードは、IndexSort パラメーターを指定して検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の col1 フィールドと Long 型の col2 フィールドで構成されています。

func createSearchIndex_withIndexSort(client *tablestore.TableStoreClient){
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>" // データテーブルの名前を指定します。
    request.IndexName = "<SEARCH_INDEX_NAME>" // 検索インデックスの名前を指定します。

    schemas := []*tablestore.FieldSchema{}
    field1 := &tablestore.FieldSchema{
        FieldName: proto.String("col1"), // proto.String メソッドを呼び出して、フィールドの名前を指定します。このメソッドは、文字列ポインターを要求するために使用されます。
        FieldType: tablestore.FieldType_KEYWORD, // フィールドの型を指定します。
        Index:     proto.Bool(true), // フィールドのインデックス作成を有効にします。
        EnableSortAndAgg: proto.Bool(true), // ソートと集約を有効にします。
    }
    field2 := &tablestore.FieldSchema{
        FieldName: proto.String("col2"),
        FieldType: tablestore.FieldType_LONG,
        Index:     proto.Bool(true),
        EnableSortAndAgg: proto.Bool(true),
    }

    schemas = append(schemas, field1, field2)
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: schemas, // 検索インデックスに含まれるフィールドを指定します。
        IndexSort: &search.Sort{ // インデックスの事前ソート設定を指定します。データは、col2 フィールドの値に基づいて昇順でソートされ、次に col1 フィールドの値に基づいて降順でソートされます。
            Sorters: []search.Sorter{
                &search.FieldSort{
                    FieldName: "col2",
                    Order:     search.SortOrder_ASC.Enum(),
                },
                &search.FieldSort{
                    FieldName: "col1",
                    Order:     search.SortOrder_DESC.Enum(),
                },
            },
        },
    }
    resp, err := client.CreateSearchIndex(request) // クライアントを呼び出して、検索インデックスを作成します。
    if err != nil {
        fmt.Println("error :", err) // エラー:
        return
    }
    fmt.Println("CreateSearchIndex finished, requestId:", resp.ResponseInfo.RequestId) // CreateSearchIndex が完了しました。リクエスト ID:
}

TTL を指定して検索インデックスを作成する

重要

データテーブルの更新操作が禁止されていることを確認してください。

func createIndexWithTTL(client *tablestore.TableStoreClient) {
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>"
    request.IndexName = "<SEARCH_INDEX_NAME>"
    schemas := []*tablestore.FieldSchema{}
    field1 := &tablestore.FieldSchema{
        FieldName:        proto.String("col1"), // proto.String メソッドを呼び出して、フィールドの名前を指定します。このメソッドは、文字列ポインターを要求するために使用されます。
        FieldType:        tablestore.FieldType_KEYWORD, // フィールドの型を指定します。
        Index:            proto.Bool(true), // フィールドのインデックス作成を有効にします。
        EnableSortAndAgg: proto.Bool(true), // ソートと集約を有効にします。
    }
    field2 := &tablestore.FieldSchema{
        FieldName:        proto.String("col2"),
        FieldType:        tablestore.FieldType_LONG,
        Index:            proto.Bool(true),
        EnableSortAndAgg: proto.Bool(true),
    }
    schemas = append(schemas, field1, field2)
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: schemas, // 検索インデックスに含まれるフィールドを指定します。
    }
    request.TimeToLive = proto.Int32(3600 * 24 * 7) // 検索インデックスの TTL を 7 日間に設定します。
    resp, err := client.CreateSearchIndex(request)
    if err != nil {
       fmt.Println("error :", err) // エラー:
       return
   }
    fmt.Println("createIndexWithTTL finished, requestId:", resp.ResponseInfo.RequestId) // createIndexWithTTL が完了しました。リクエスト ID:
}

ハイライト機能を有効にして検索インデックスを作成する

次のサンプルコードは、ハイライト機能を有効にして検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、Keyword 型の col_keyword フィールド、Long 型の col_long フィールド、Text 型の col_text フィールド、および Nested 型の col_nested フィールドで構成されています。col_nested フィールドは、Text 型の level1_text サブフィールドと Text 型の level2_text サブフィールドで構成されています。この例では、Text 型の col_text フィールド、Text 型の level1_text サブフィールド、および Text 型の level2_text サブフィールドでハイライト機能が有効になっています。

func createSearchIndexwithHighlighting(client *tablestore.TableStoreClient) {
    request := &tablestore.CreateSearchIndexRequest{}
    request.TableName = "<TABLE_NAME>"
    request.IndexName = "<SEARCH_INDEX_NAME>"
    request.IndexSchema = &tablestore.IndexSchema{
        FieldSchemas: []*tablestore.FieldSchema{
            {
                FieldName:        proto.String("col_keyword"),
                FieldType:        tablestore.FieldType_KEYWORD, // 文字列型。
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {
                FieldName:        proto.String("col_long"),
                FieldType:        tablestore.FieldType_LONG, // Long 型。
                Index:            proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
            },
            {// ネストされていないフィールドのハイライト機能を有効にします。
                FieldName: proto.String("col_text"),
                FieldType: tablestore.FieldType_TEXT, // Text 型。
                Index:     proto.Bool(true),
                EnableSortAndAgg: proto.Bool(true),
                EnableHighlighting: proto.Bool(true),
            },
            {// ネストされたフィールドのサブフィールドのハイライト機能を有効にします。
                FieldName: proto.String("col_nested"),
                FieldType: tablestore.FieldType_NESTED,
                FieldSchemas: []*tablestore.FieldSchema{
                    {
                        FieldName:          proto.String("level1_text"),
                        FieldType:          tablestore.FieldType_TEXT,
                        Index:              proto.Bool(true),
                        EnableHighlighting: proto.Bool(true),
                    },
                    {
                        FieldName: proto.String("level1_nested"),
                        FieldType: tablestore.FieldType_NESTED,
                        FieldSchemas: []*tablestore.FieldSchema{
                            {
                                FieldName:          proto.String("level2_text"),
                                FieldType:          tablestore.FieldType_TEXT,
                                Index:              proto.Bool(true),
                                EnableHighlighting: proto.Bool(true),
                            },
                        },
                    },
                },
            },
        },
    }
    _, err := client.CreateSearchIndex(request)
    if err != nil {
        fmt.Println("Failed to create searchIndex with error:", err) // 検索インデックスの作成に失敗しました。エラー:
        return
    }
}

FAQ

関連情報