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 | フィールドスキーマのリスト。各フィールドスキーマでは、次のパラメータを設定します。
|
IndexSetting | 検索インデックスの設定。RoutingFields パラメータの設定が含まれます。 RoutingFields(オプション):カスタムルーティングフィールド。特定のプライマリキー列をルーティングフィールドとして指定できます。Tablestore は、ルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。ルーティングフィールドの値が同じデータは、同じパーティションに分散されます。 |
IndexSort | 検索インデックスの事前ソート設定。Sorters パラメータの設定が含まれます。IndexSort パラメータを空のままにすると、フィールド値はプライマリキーでソートされます。 説明 ネストされたフィールドを含む検索インデックスの事前ソート設定はスキップできます。 Sorters(必須):検索インデックスの事前ソート方法。有効な値:PrimaryKeySort および FieldSort。詳細については、ソートとページングを参照してください。
|
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 操作を呼び出して、フィールド情報や検索インデックス設定など、検索インデックスの説明をクエリできます。詳細については、検索インデックスの説明をクエリするを参照してください。
不要になった検索インデックスを削除できます。詳細については、検索インデックスを削除するを参照してください。