フィルターを設定すると、Tablestore はサーバー上でクエリ結果をフィルタリングします。フィルター条件に一致する行のみが返されます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
使用上の注意
GetRow、BatchGetRow、または GetRange 操作を呼び出してデータをクエリする場合、フィルターを使用してフィルター条件に一致する行のみを返すことができます。
使用可能なフィルターは、SingleColumnValueFilter、SingleColumnValueRegexFilter、および CompositeColumnValueFilter です。
SingleColumnValueFilter は、参照列の値に基づいて行をフィルタリングするかどうかを決定します。
SingleColumnValueRegexFilter は、正規表現を使用して String 型の列値を照合し、一致した部分文字列を抽出します。次に、このフィルターは、抽出された部分文字列のデータ型を String、Integer、または Double に変換し、変換後の値をフィルタリングします。
CompositeColumnValueFilter は、複数の参照列の値の照合結果の論理結合に基づいて行をフィルタリングするかどうかを決定します。
フィルターの詳細については、フィルターの設定を参照してください。
注意事項
フィルター条件は、=, !=, >, >=, <, <= の関係演算子と、NOT、AND、OR の論理演算子をサポートしています。フィルター条件には、最大 10 個のサブ条件を含めることができます。
フィルターで使用される参照列は、クエリ結果に含まれている必要があります。データを読み取る指定された列に参照列が含まれていない場合、フィルターは参照列の値をクエリできません。
GetRange 操作を使用する場合、一度に最大 5,000 行または 4 MB のデータをスキャンできます。
スキャンの範囲内でフィルター条件に一致するデータがない場合、返される行は空になります。ただし、NextStartPrimaryKey は空でない場合があります。NextStartPrimaryKey が空でない場合は、パラメーター値を使用して NextStartPrimaryKey の戻り値が空になるまでスキャンを続けます。
パラメーター
パラメーター | 説明 |
ColumnName | フィルターで使用される参照列の名前。 |
ColumnValue | フィルターで使用される参照列の値。 |
CompareOperator | フィルターで使用される関係演算子。 以下の関係演算子がサポートされています:EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<), LESS_EQUAL (<=)。 |
LogicOperator | フィルターで使用される論理演算子。 以下の論理演算子がサポートされています:NOT、AND、OR。 |
PassIfMissing | 行に参照列が存在しない場合に、行を返すかどうかを指定します。有効な値:
|
LatestVersionsOnly | 参照列に複数バージョンのデータが含まれている場合、比較に参照列の最新バージョンのデータのみを使用するかどうかを指定します。有効な値:
|
Regex | サブフィールド値の照合に使用される正規表現。正規表現は、以下の条件を満たす必要があります。
|
VariantType | 正規表現を使用してサブフィールド値を照合する場合の、変換後のサブフィールド値のデータ型。有効な値:VT_INTEGER (整数型), VT_STRING (文字列型), VT_DOUBLE (倍精度浮動小数点型)。 |
例
SingleColumnValueFilter を使用してデータをフィルタリングする
次のサンプルコードは、データテーブルの行から最新バージョンのデータを読み取り、フィルターを使用して Col0 列の値に基づいてデータをフィルタリングする方法の例を示しています。
private static void getRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名とプライマリキーを指定して、データの行を読み取ります。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
// MaxVersions パラメーターを 1 に設定して、最新バージョンのデータを読み取ります。
criteria.setMaxVersions(1);
// Col0 列の値が 0 である行を返すようにフィルターを設定します。
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
// Col0 列が存在しない場合、行は返されません。
singleColumnValueFilter.setPassIfMissing(false);
criteria.setFilter(singleColumnValueFilter);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("読み取り完了。結果:");
System.out.println(row);
}
SingleColumnValueRegexFilter を使用して正規表現マッチングに基づいてデータをフィルタリングする
次のサンプルコードは、プライマリキー値が Col1 列の ["pk:2020-01-01.log", "pk:2021-01-01.log")
の範囲内にあるデータを読み取り、正規表現を使用して Col1 列のデータをフィルタリングする方法の例を示しています。
private static void getRange(SyncClient client) {
// データテーブルの名前を指定します。
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// 読み取るデータのプライマリキーの範囲として ["pk:2020-01-01.log", "pk:2021-01-01.log") を指定します。範囲は左閉右開区間です。
PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2020-01-01.log"))
.build();
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2021-01-01.log"))
.build();
criteria.setInclusiveStartPrimaryKey(pk0);
criteria.setExclusiveEndPrimaryKey(pk1);
// MaxVersions パラメーターを 1 に設定して、最新バージョンのデータを読み取ります。
criteria.setMaxVersions(1);
// フィルターを設定します。cast<int>(regex(Col1)) が 100 より大きい場合、行が返されます。
RegexRule regexRule = new RegexRule("t1:([0-9]+),", RegexRule.CastType.VT_INTEGER);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter("Col1",
regexRule,SingleColumnValueRegexFilter.CompareOperator.GREATER_THAN,ColumnValue.fromLong(100));
criteria.setFilter(filter);
while (true) {
GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
for (Row row : resp.getRows()) {
// 何か処理を行う
System.out.println(row);
}
if (resp.getNextStartPrimaryKey() != null) {
criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
} else {
break;
}
}
}
CompositeColumnValueFilter を使用してデータをフィルタリングする
次のサンプルコードは、プライマリキーが ["a","h")
の範囲内にある行を返すために使用されます。さらに、Col0 の値が 0 で、Col1 の値が 100 より大きい、または Col2 の値が 10 以下のいずれかである必要があります。
private static void getRange(SyncClient client) {
// データテーブルの名前を指定します。
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// プライマリキーの範囲を指定します。プライマリキーの範囲は左閉右開区間です。
PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("a"))
.build();
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("h"))
.build();
criteria.setInclusiveStartPrimaryKey(pk0);
criteria.setExclusiveEndPrimaryKey(pk1);
// maxVersions パラメーターを 1 に設定して、最新バージョンのデータを読み取ります。
criteria.setMaxVersions(1);
// composite1 条件を (Col0 == 0) AND (Col1 > 100) に設定します。
CompositeColumnValueFilter composite1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
SingleColumnValueFilter single1 = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
SingleColumnValueFilter single2 = new SingleColumnValueFilter("Col1",
SingleColumnValueFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
composite1.addFilter(single1);
composite1.addFilter(single2);
// composite2 条件を ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10) に設定します。
CompositeColumnValueFilter composite2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
SingleColumnValueFilter single3 = new SingleColumnValueFilter("Col2",
SingleColumnValueFilter.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
composite2.addFilter(composite1);
composite2.addFilter(single3);
criteria.setFilter(composite2);
while (true) {
GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
for (Row row : resp.getRows()) {
// 何か処理を行う
System.out.println(row);
}
if (resp.getNextStartPrimaryKey() != null) {
criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
} else {
break;
}
}
}
関連情報
アプリケーションが異なる属性列をクエリ条件として使用してデータをクエリする必要がある場合、属性列をセカンダリインデックスのプライマリキー列として指定できます。これにより、セカンダリインデックスを使用して属性列に基づいてデータをクエリできます。これにより、データクエリが高速化されます。詳細については、セカンダリインデックスを参照してください。
ビジネスで多次元クエリとデータ分析が必要な場合は、検索インデックスを作成し、必要な属性列を検索インデックスのフィールドとして指定できます。その後、検索インデックスを使用してデータをクエリおよび分析できます。たとえば、検索インデックスを使用して、非プライマリキー列、ブールクエリ、あいまいクエリに基づいてクエリを実行できます。また、検索インデックスを使用して、最大値と最小値を取得したり、行数の統計を収集したり、クエリ結果をグループ化したりすることもできます。詳細については、検索インデックスを参照してください。
SQL クエリ機能を使用して、テーブル内のデータをクエリおよび分析できます。詳細については、データのクエリを参照してください。