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

Tablestore:セカンダリインデックスを使用してデータを読み取る

最終更新日:Dec 28, 2024

Tablestoreでは、インデックステーブルから単一のデータ行、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。インデックステーブルに返したい属性列が含まれている場合は、インデックステーブルを読み取ってデータを取得できます。そうでない場合は、インデックステーブルが作成されたデータテーブルからデータをクエリする必要があります。

前提条件

使用上の注意

  • インデックステーブルはデータの読み取りにのみ使用できます。

  • ローカルセカンダリインデックスの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。

  • 返したい属性列がインデックステーブルに含まれていない場合は、インデックステーブルが作成されたデータテーブルからデータをクエリして、必要な属性列を取得する必要があります。

単一のデータ行を読み取る

GetRowオペレーションを呼び出して、単一のデータ行を読み取ることができます。詳細については、単一のデータ行を読み取るを参照してください。

パラメータ

GetRowオペレーションを呼び出してインデックステーブルからデータを読み取る場合は、以下の点に注意してください。

  • TableNameパラメータをインデックステーブルの名前に設定する必要があります。

  • Tablestoreは、インデックス列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。したがって、インデックステーブルの行のプライマリキー列を指定する場合は、インデックステーブルを作成したインデックス列とデータテーブルのプライマリキー列に基づいて指定する必要があります。

次のサンプルコードは、行のプライマリキーに基づいてインデックステーブルのデータ行を読み取る方法の例を示しています。

func GetRowFromIndex(client *tablestore.TableStoreClient, indexName string) {
    getRowRequest := new(tablestore.GetRowRequest)
    criteria := new(tablestore.SingleRowQueryCriteria);
    // プライマリキーを構築します。ローカルセカンダリインデックスからデータを読み取る場合は、インデックステーブルの最初のプライマリキー列はデータテーブルの最初のプライマリキー列と同じである必要があります。
    putPk := new(tablestore.PrimaryKey)
    putPk.AddPrimaryKeyColumn("definedcol1", "value1")
    putPk.AddPrimaryKeyColumn("pk1", int64(2))
    putPk.AddPrimaryKeyColumn("pk2", []byte("pk2"))
    criteria.PrimaryKey = putPk
  
    getRowRequest.SingleRowQueryCriteria = criteria
    getRowRequest.SingleRowQueryCriteria.TableName = indexName 
    getRowRequest.SingleRowQueryCriteria.MaxVersion = 1  
    getResp, err := client.GetRow(getRowRequest)
    if err != nil {
        fmt.Println("getrow failed with error:", err)
    } else {
        fmt.Println("get row", getResp.Columns[0].ColumnName,"result is ", getResp.Columns[0].Value,)
    }                   
}

プライマリキー値が特定の範囲内にあるデータを読み取る

GetRangeオペレーションを呼び出して、プライマリキー値が特定の範囲内にあるデータを読み取ることができます。詳細については、プライマリキー値が特定の範囲内にあるデータを読み取るを参照してください。

パラメータ

GetRangeオペレーションを呼び出してインデックステーブルからデータを読み取る場合は、以下の点に注意してください。

  • TableNameパラメータをインデックステーブルの名前に設定する必要があります。

  • Tablestoreは、インデックス列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。したがって、クエリする範囲の開始プライマリキーと終了プライマリキーを指定する場合は、インデックステーブルを作成したインデックス列とデータテーブルのプライマリキー列に基づいて指定する必要があります。

グローバルセカンダリインデックスを使用する

次のサンプルコードは、グローバルセカンダリインデックスからプライマリキー値が特定の範囲内にあるデータを読み取る方法の例を示しています。この例では、グローバルセカンダリインデックスの最初のプライマリキー列はdefinedcol1です。範囲に指定されたdefinedcol1列の値はvalue1です。

func GetRangeFromGlobalIndex(client *tablestore.TableStoreClient, indexName string) {
    getRangeRequest := &tablestore.GetRangeRequest{}
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = indexName

    // 範囲の開始プライマリキーを構築します。プライマリキー値の範囲は左閉右開区間です。
    startPK := new(tablestore.PrimaryKey)
    // 最初のプライマリキー列の値を指定します。
    startPK.AddPrimaryKeyColumn("definedcol1", "value1") 
    // 2番目のプライマリキー列の値を指定します。2番目のプライマリキー列は、グローバルセカンダリインデックスのインデックス列として使用されていないデータテーブルのプライマリキー列です。
    startPK.AddPrimaryKeyColumnWithMinValue("pk1") 
    // 3番目のプライマリキー列の値を指定します。3番目のプライマリキー列は、グローバルセカンダリインデックスのインデックス列として使用されていないデータテーブルのプライマリキー列です。
    startPK.AddPrimaryKeyColumnWithMinValue("pk2") 

    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumn("definedcol1", "value1")
    endPK.AddPrimaryKeyColumnWithMaxValue("pk1")  
    endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    rangeRowQueryCriteria.Direction = tablestore.FORWARD
    rangeRowQueryCriteria.MaxVersion = 1
    rangeRowQueryCriteria.Limit = 10
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria

    getRangeResp, err := client.GetRange(getRangeRequest)

    fmt.Println("get range result is ", getRangeResp)

    for {
        if err != nil {
            fmt.Println("get range failed with error:", err)
        }
        if len(getRangeResp.Rows) > 0 {
            for _, row := range getRangeResp.Rows {
                fmt.Println("range get row with key", row.PrimaryKey.PrimaryKeys[0].Value, row.PrimaryKey.PrimaryKeys[1].Value, row.PrimaryKey.PrimaryKeys[2].Value)
            }
            if getRangeResp.NextStartPrimaryKey == nil {
                break
            } else {
                fmt.Println("next pk is :", getRangeResp.NextStartPrimaryKey.PrimaryKeys[0].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[1].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[2].Value)
                getRangeRequest.RangeRowQueryCriteria.StartPrimaryKey = getRangeResp.NextStartPrimaryKey
                getRangeResp, err = client.GetRange(getRangeRequest)
            }
        } else {
            break
        }

        fmt.Println("continue to query rows")
    }
    fmt.Println("getrow finished")
}

ローカルセカンダリインデックスを使用する

次のサンプルコードは、ローカルセカンダリインデックスからすべての行のデータを読み取る方法の例を示しています。

func GetRangeFromLocalIndex(client *tablestore.TableStoreClient, indexName string) {
    getRangeRequest := &tablestore.GetRangeRequest{}
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = indexName
  
    // 範囲の開始プライマリキーを構築します。プライマリキー値の範囲は左閉右開区間です。
    startPK := new(tablestore.PrimaryKey)
    // 最初のプライマリキー列の値を指定します。
    startPK.AddPrimaryKeyColumnWithMinValue("pk1")
    // 2番目のプライマリキー列の値を指定します。
    startPK.AddPrimaryKeyColumnWithMinValue("definedcol1") 
    // 3番目のプライマリキー列の値を指定します。3番目のプライマリキー列は、グローバルセカンダリインデックスのインデックス列として使用されていないデータテーブルのプライマリキー列です。
    startPK.AddPrimaryKeyColumnWithMinValue("pk2") 
   
    // 範囲の終了プライマリキーを構築します。
    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumnWithMaxValue("pk1")
    endPK.AddPrimaryKeyColumnWithMaxValue("definedcol1")  
    endPK.AddPrimaryKeyColumnWithMaxValue("pk2")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    rangeRowQueryCriteria.Direction = tablestore.FORWARD
    rangeRowQueryCriteria.MaxVersion = 1
    rangeRowQueryCriteria.Limit = 10
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria

    getRangeResp, err := client.GetRange(getRangeRequest)

    fmt.Println("get range result is ", getRangeResp)

    for {
        if err != nil {
            fmt.Println("get range failed with error:", err)
        }
        if len(getRangeResp.Rows) > 0 {
            for _, row := range getRangeResp.Rows {
                fmt.Println("range get row with key", row.PrimaryKey.PrimaryKeys[0].Value, row.PrimaryKey.PrimaryKeys[1].Value, row.PrimaryKey.PrimaryKeys[2].Value)
                // インデックステーブルの属性列を返すには、次のサンプルコードに基づいてコードを記述します。
                //fmt.Println("get row", row.Columns[0].ColumnName, "result is ", row.Columns[0].Value)
            }
            if getRangeResp.NextStartPrimaryKey == nil {
                break
            } else {
                fmt.Println("next pk is :", getRangeResp.NextStartPrimaryKey.PrimaryKeys[0].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[1].Value, getRangeResp.NextStartPrimaryKey.PrimaryKeys[2].Value)
                getRangeRequest.RangeRowQueryCriteria.StartPrimaryKey = getRangeResp.NextStartPrimaryKey
                getRangeResp, err = client.GetRange(getRangeRequest)
            }
        } else {
            break
        }

        fmt.Println("continue to query rows")
    }
    fmt.Println("getrow finished")
}

FAQ

関連情報

  • ビジネスで多次元クエリとデータ分析が必要な場合は、検索インデックスを作成し、必要な属性を検索インデックスのフィールドとして指定できます。その後、検索インデックスを使用してデータのクエリと分析を実行できます。たとえば、検索インデックスを使用して、非プライマリキー列、ブールクエリ、あいまいクエリに基づいてクエリを実行できます。また、検索インデックスを使用して、最大値と最小値を取得したり、行数の統計を収集したり、クエリ結果をグループ化したりすることもできます。詳細については、検索インデックスを参照してください。

  • SQLステートメントを実行してデータのクエリと分析を実行する場合は、SQLクエリ機能を使用できます。詳細については、SQLクエリを参照してください。