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 | フィールドスキーマのリスト。各フィールドスキーマで、以下のパラメーターを構成します。
|
IndexSetting | 検索インデックスの設定。RoutingFields パラメーターの設定を含みます。 RoutingFields(オプション): カスタムルーティングフィールド。特定のプライマリキー列をルーティングフィールドとして指定できます。ほとんどの場合、ルーティングフィールドは 1 つだけ指定する必要があります。複数のルーティングフィールドを指定すると、システムはルーティングフィールドの値を 1 つの値に連結してパーティションキーとして使用します。 Tablestore は、ルーティングフィールドに基づいて、検索インデックスに書き込まれたデータを異なるパーティションに分散します。ルーティングフィールドの値が同じデータは、同じパーティションに分散されます。 |
IndexSort | 検索インデックスの事前ソート設定。Sorters パラメーターの設定を含みます。IndexSort パラメーターを空のままにすると、フィールド値はプライマリキーでソートされます。 説明 ネストされたフィールドを含む検索インデックスの事前ソート設定はスキップできます。 Sorters(必須): 検索インデックスの事前ソート方法。有効な値:PrimaryKeySort および FieldSort。詳細については、「ソートとページング」をご参照ください。
|
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
関連情報
多次元インデックスを作成すると、多次元インデックスで提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。 多次元インデックスでは、通常、次のクエリメソッドが提供されます。term クエリ、terms クエリ、完全一致クエリ、一致クエリ、フレーズ一致クエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、ジオクエリ、ブール値クエリ、KNN ベクタークエリ、ネストされたクエリ、exists クエリ。
データをクエリする際に、結果セットに対してソートとページングを実行したり、ハイライト機能を使用して結果セット内のキーワードを強調表示したり、折りたたみ (個別化) 機能を使用して特定のフィールドに基づいて結果セットを折りたたんだりすることができます。詳細については、「ソートとページング」、「クエリ結果のハイライト」、および「折りたたみ (個別化)」をご参照ください。
検索インデックスを作成した後、ビジネス要件に基づいて検索インデックスを管理できます。たとえば、検索インデックスの TTL の管理、検索インデックスのスキーマの動的な変更、インスタンス内の検索インデックスの名前のクエリ、検索インデックスの情報のクエリ、および検索インデックスの削除を実行できます。詳細については、「検索インデックスの TTL を指定する」、「検索インデックスのスキーマを動的に変更する」、「検索インデックスを一覧表示する」、「検索インデックスの説明をクエリする」、および「検索インデックスを削除する」をご参照ください。
集約機能または SQL クエリ機能を使用して、テーブル内のデータを分析できます。たとえば、最大値と最小値、値の合計、および行数をクエリできます。詳細については、「集約」および「SQL クエリ」をご参照ください。
クエリ条件を満たすすべての行を、行をソートする必要なく取得する場合、並列スキャン機能を使用できます。詳細については、「並列スキャンを実行する」をご参照ください。