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

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

最終更新日:Dec 28, 2024

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

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスを初期化するを参照してください。

  • maxVersions パラメータが 1 に設定されたデータテーブルが作成されていること。さらに、データテーブルの TimeToLive パラメータは、次のいずれかの条件を満たしている必要があります。詳細については、データテーブルを作成するを参照してください。

    • データテーブルの TimeToAlive パラメータが -1 に設定されていること。これは、データテーブル内のデータが期限切れにならないことを指定します。

    • データテーブルの TimeToAlive パラメータが -1 以外の値に設定されており、データテーブルの更新操作が禁止されていること。

使用上の注意

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

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

パラメータ

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

パラメータ

説明

TableName

データテーブルの名前。

IndexName

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

FieldSchemas

フィールドスキーマのリスト。各フィールドスキーマでは、次のパラメータを設定します。

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

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

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

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

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

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

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

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

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

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

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

    重要

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

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

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

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

  • EnableHighlighting(オプション):ハイライト機能を有効にするかどうかを指定します。型:Boolean。デフォルト値:false。これは、フィールドのハイライト機能が無効になっていることを指定します。このパラメータを true に設定すると、ハイライト機能を使用できます。Text フィールドのみがハイライト機能をサポートしています。

    重要

    このパラメータは、Tablestore SDK を使用する場合にのみ設定できます。

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

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

    • Dimension:ベクトルの次元数。ベクトルの次元数の制限については、検索インデックスの制限を参照してください。

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

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

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

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

      詳細については、付録:ベクトル距離測定アルゴリズムを参照してください。

IndexSetting

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

RoutingFields(オプション):カスタムルーティングフィールド。特定のプライマリキー列をルーティングフィールドとして指定できます。Tablestore は、ルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。ルーティングフィールドの値が同じデータは、同じパーティションに分散されます。

IndexSort

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

説明

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

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

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

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

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

    説明

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

    • FieldName:値を使用してデータをソートする列の名前。

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

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

TimeToLive

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

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

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

検索インデックスの 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, // 長整数型
                Index:            proto.Bool(true), // インデックスを有効にする
                EnableSortAndAgg: proto.Bool(true), // ソートと集計を有効にする
            },
            {
                FieldName: proto.String("col_vector"),
                FieldType: tablestore.FieldType_VECTOR, // ベクトル型
                Index:     proto.Bool(true), // インデックスを有効にする
                VectorOptions: &tablestore.VectorOptions{
                    VectorDataType:   tablestore.VectorDataType_FLOAT_32.Enum(), // ベクトルのデータ型をfloat32に設定
                    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)
}

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)
}

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

次のサンプルコードは、ハイライト機能を有効にして検索インデックスを作成する方法の例を示しています。この例では、検索インデックスは、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, // 長整数型
                Index:            proto.Bool(true), // インデックスを有効にする
                EnableSortAndAgg: proto.Bool(true), // ソートと集計を有効にする
            },
            {// ネストされていないフィールドのハイライト機能を有効にします。
                FieldName: proto.String("col_text"),
                FieldType: tablestore.FieldType_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

関連情報

  • 検索インデックスを作成した後、検索インデックスで提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数の次元からデータをクエリできます。検索インデックスは通常、次のクエリメソッドを提供します。タームクエリタームズクエリマッチオールクエリマッチクエリマッチフレーズクエリプレフィックスクエリ範囲クエリワイルドカードクエリジオクエリブールクエリKNNベクトルクエリネストクエリ、および存在クエリ

    Search 操作を呼び出してデータをクエリする場合、ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングを参照してください。

  • Search 操作を呼び出してデータをクエリする場合、折りたたみ(重複排除)機能を使用して、特定のフィールドに基づいて結果セットを折りたたむことができます。このようにして、指定された型のデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。

  • 検索インデックスの TTL を指定して、検索インデックス内の履歴データを削除したり、検索インデックス内のデータの保持期間を延長したりできます。詳細については、検索インデックスの TTL を指定するを参照してください。

  • テーブル内のデータを分析する場合、Search 操作を呼び出して集計機能または SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、集計およびSQL クエリを参照してください。

  • 行をソートせずにクエリ条件を満たすすべての行を取得する場合、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを実行するを参照してください。

  • 検索インデックスのスキーマを動的に変更して、検索インデックスにインデックスフィールドを追加、更新、または削除できます。詳細については、検索インデックスのスキーマを動的に変更するを参照してください。

  • ListSearchIndex 操作を呼び出して、データテーブルに作成されたすべての検索インデックスをクエリできます。詳細については、検索インデックスを一覧表示するを参照してください。

  • DescribeSearchIndex 操作を呼び出して、フィールド情報や検索インデックス設定など、検索インデックスの説明をクエリできます。詳細については、検索インデックスの説明をクエリするを参照してください。

  • 不要になった検索インデックスを削除できます。詳細については、検索インデックスを削除するを参照してください。