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

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

最終更新日:Dec 28, 2024

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

説明

セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。セカンダリインデックス機能の詳細については、セカンダリインデックスを参照してください。

前提条件

使用上の注意

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

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

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

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

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

パラメーター

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

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

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

次のサンプルコードは、インデックステーブルから行の特定の属性列を読み取る方法の例を示しています。

private static void getRowFromIndex(SyncClient client) {
    // プライマリキーを構築します。ローカルセカンダリインデックスからデータを読み取る場合は、インデックステーブルの最初のプライマリキー列はデータテーブルの最初のプライマリキー列と同じである必要があります。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.fromString("def1"));
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromLong(100));
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromString("pri1"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();

    // データ行を読み取るインデックステーブルの名前と行のプライマリキーを指定します。
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<INDEX_NAME>", primaryKey);
    // 最新バージョンのデータを読み取るには、MaxVersionsパラメーターを1に設定します。
    criteria.setMaxVersions(1);
    GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    Row row = getRowResponse.getRow();
    // 読み取る行が存在しない場合は、nullが返されます。
    System.out.println("読み取り完了。結果:");
    System.out.println(row);

    // 読み取る属性列を指定します。
    criteria.addColumnsToGet("Col0");
    getRowResponse = client.getRow(new GetRowRequest(criteria));
    row = getRowResponse.getRow();
    
    System.out.println("読み取り完了。結果:");
    System.out.println(row);
} 

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

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

パラメーター

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

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

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

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

インデックステーブルに返したい属性列が含まれている場合は、インデックステーブルから必要なデータをクエリできます。

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    System.out.println("インデックステーブルから返された結果:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // レスポンスでnextStartPrimaryKeyパラメーターがnullでない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

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

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
            PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
            PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
            PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
            // インデックステーブルのプライマリキーに基づいて、データテーブルのプライマリキーを指定します。
            PrimaryKey mainTablePK = mainTablePKBuilder.build(); 

            // データテーブルからデータをクエリします。
            SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", mainTablePK);
            // 返す属性列を指定します。この例では、DEFINED_COL_NAME_3列が返されます。
            criteria.addColumnsToGet(DEFINED_COL_NAME_3); 
            // 最新バージョンのデータを読み取るには、MaxVersionsパラメーターを1に設定します。
            criteria.setMaxVersions(1);
            GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
            Row mainTableRow = getRowResponse.getRow();
            System.out.println(row); 
        }

        // レスポンスでnextStartPrimaryKeyパラメーターがnullでない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

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

インデックステーブルに返したい属性列が含まれている場合は、インデックステーブルから必要なデータをクエリできます。

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("INDEX_NAME"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックス列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    // インデックス列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    System.out.println("インデックステーブルから返された結果:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // レスポンスでnextStartPrimaryKeyパラメーターがnullでない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

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

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックス列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックス列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックス列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックス列として指定されていないデータテーブルのプライマリキー列の値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
            PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
            PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
            PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
            // インデックステーブルのプライマリキーに基づいて、データテーブルのプライマリキーを指定します。
            PrimaryKey mainTablePK = mainTablePKBuilder.build(); 

            // データテーブルからデータをクエリします。
            SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("TABLE_NAME", mainTablePK);
            // データテーブルから返す属性列を指定します。この例では、DEFINED_COL_NAME3列が返されます。
            criteria.addColumnsToGet(DEFINED_COL_NAME3); 
            // 最新バージョンのデータを読み取るには、MaxVersionsパラメーターを1に設定します。
            criteria.setMaxVersions(1);
            GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
            Row mainTableRow = getRowResponse.getRow();
            System.out.println(row); 
        }

        // レスポンスでnextStartPrimaryKeyパラメーターがnullでない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

FAQ

参考資料

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

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