Tablestoreでは、インデックステーブルから単一のデータ行、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。インデックステーブルに返したい属性列が含まれている場合は、インデックステーブルを読み取ってデータを取得できます。そうでない場合は、インデックステーブルが作成されたデータテーブルからデータをクエリする必要があります。
セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。セカンダリインデックス機能の詳細については、セカンダリインデックスを参照してください。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
セカンダリインデックスが作成されていること。詳細については、セカンダリインデックスの作成を参照してください。
使用上の注意
インデックステーブルはデータの読み取りにのみ使用できます。
ローカルセカンダリインデックスの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。
返したい属性列がインデックステーブルに含まれていない場合は、必要な属性列を取得するために、インデックステーブルが作成されたデータテーブルからデータをクエリする必要があります。
単一のデータ行を読み取る
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クエリを参照してください。