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

Tablestore:フィルターの使用

最終更新日:Aug 06, 2026

Tablestore SDK for Java は、サーバー側で列の値に基づいて行をフィルターしたり、属性列のスライスを返したりすることで、クライアントに転送されるデータ量を削減します。

前提条件

Tablestore SDK for Java をインストールし、クライアントを初期化します。

説明

フィルターは、各行が読み取られた後にサーバーで実行され、条件に一致する行のみを返します。フィルタリングは読み取り後に行われるため、スキャンされる行数は減りませんが、ネットワーク経由で送信されるデータ量は削減されます。

SingleRowQueryCriteria、RangeRowQueryCriteria、MultiRowQueryCriteria、または RangeIteratorParameter で setFilter を呼び出してフィルターを設定します。 次のフィルタータイプが利用可能です。

  • SingleColumnValueFilter :1つの属性列の値を、関係演算子を使用してターゲット値と比較します。

  • SingleColumnValueRegexFilter: 正規表現を使用して String 型のプロパティ列から部分文字列を抽出し、ターゲット型に変換して、ターゲット値と比較します。

  • CompositeColumnValueFilter は、論理演算子 (AND、OR、または NOT) を使用して複数のフィルターを組み合わせます。複合フィルターは最大 32 個のサブ条件をサポートします。

  • ColumnPaginationFilter :列の値を評価せずに、オフセットとリミットに基づいて属性列を返します。

new SingleColumnValueFilter(columnName, operator, columnValue)
new SingleColumnValueRegexFilter(columnName, regexRule, operator, columnValue)
new CompositeColumnValueFilter(logicOperator)
new ColumnPaginationFilter(limit, offset)

次の例では、SingleColumnValueFilter を使用して、filter_demo テーブルから col1 列が val1 と等しい行を読み取ります。

RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");

PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());

PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());

criteria.setMaxVersions(1);

// フィルターを構築:col1 == "val1"
SingleColumnValueFilter filter = new SingleColumnValueFilter(
        "col1",
        SingleColumnValueFilter.CompareOperator.EQUAL,
        ColumnValue.fromString("val1"));
criteria.setFilter(filter);

GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());

パラメーター

単一列の値フィルター

SingleColumnValueFilter のコンストラクターには、以下のパラメーターが含まれています。

名前

型

説明

columnName (必須)

String

評価する属性列の名前。

operator (必須)

CompareOperator

関係演算子。有効値:

  • EQUAL (等しい)

  • NOT_EQUAL (等しくない)

  • GREATER_THAN (より大きい)

  • GREATER_EQUAL (以上)

  • LESS_THAN(未満)

  • LESS_EQUAL (以下)

columnValue (必須)

ColumnValue

比較に使用する値。

passIfMissing (任意)

boolean

対象の列を含まない行を返すかどうか。 デフォルトは true で、その場合は該当する行が返されます。

対象の列を含まない行を除外するには、false に設定します。

latestVersionsOnly (任意)

boolean

カラムの最新バージョンのみを評価するかどうか。デフォルトは true で、最新バージョンのみが評価されます。

false に設定すると、いずれかのバージョンが条件に一致した場合に行が返されます。

正規表現フィルター

SingleColumnValueRegexFilter のコンストラクターには、次のパラメーターが含まれています。 正規表現ルールを指定する場合、対象の属性列は String 型である必要があります。

名前

型

説明

columnName (必須)

String

評価する属性列の名前。regexRule が指定されている場合、列は String 型である必要があります。

regexRule (任意)

RegexRule

正規表現のマッチングルール。指定した場合、フィルターは文字列型の列値から部分文字列を抽出し、その部分文字列を変換してから評価します。省略した場合、フィルターは元の列値を評価します。このルールには、以下のパラメーターがあります。

  • regex: 部分文字列に一致する正規表現です。最大長は 256 バイトです。Perl 互換のシングルバイト正規表現をサポートしていますが、漢字には一致しません。また、キャプチャグループもサポートしています。式にグループが含まれている場合、正規表現は最初に一致した部分文字列を返します。たとえば、列の値が1aaa51bbb5で、正規表現が1([a-z]+)5の場合、返される部分文字列はaaaです。

  • castType: 一致した部分文字列の変換先の型。有効な値: VT_INTEGER (整数)、VT_DOUBLE (倍精度浮動小数点)、および VT_STRING (文字列)。

operator (必須)

CompareOperator

評価演算子。有効な値: EQUAL、NOT_EQUAL、GREATER_THAN、GREATER_EQUAL、LESS_THAN、LESS_EQUAL、EXIST、および NOT_EXIST。

columnValue (任意)

ColumnValue

比較値。このパラメーターは、6 つの関係演算子では必須であり、EXIST および NOT_EXIST では省略する必要があります。 regexRule が指定されている場合、値の型は castType と一致する必要があります。

latestVersionsOnly (任意)

boolean

属性列の最新バージョンのみを評価するかどうかを指定します。デフォルト値: true。false に設定した場合、いずれかのバージョンが一致すると行が返されます。

複合フィルター

CompositeColumnValueFilter のコンストラクターとサブフィルターリストには、次のパラメーターが含まれています。addFilter() を呼び出してサブフィルターを追加します。複合フィルターは、最大 32 個のサブ条件をサポートします。

名前

型

説明

type (必須)

LogicOperator

論理演算子。有効値:

  • AND (論理積)。少なくとも 2 つのサブフィルターを追加します。

  • OR (論理和)。少なくとも 2 つのサブフィルターを追加します。

  • NOT (論理否定)。サブフィルターを 1 つだけ追加します。

filters (必須)

List<ColumnValueFilter>

論理演算子によって結合されるサブフィルター。各サブフィルターは addFilter() で追加します。サブフィルターとして、SingleColumnValueFilter、SingleColumnValueRegexFilter、または別の CompositeColumnValueFilter を指定できます (ネストもサポートされています)。

属性列のページネーションフィルター

ColumnPaginationFilter のコンストラクターには、次のパラメーターが含まれています。offset が省略された場合、デフォルト値は 0 です。

名前

型

説明

limit (必須)

int

返す属性列の数。0より大きい値を指定します。

offset (任意)

int

返す最初の属性列のゼロベースのオフセット。値は 0 以上である必要があります。デフォルト値: 0。

例

正規表現で抽出した部分文字列の比較

列の値から部分文字列を抽出し、その部分文字列をターゲット値と比較するには、RegexRule を使用します。 次の例では、col2 に正規表現 1([a-z]+)5 を適用し、最初のグループをキャプチャして、文字列 aaa と比較します。

RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");

PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());

PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());

criteria.setMaxVersions(1);

// 正規表現 "1([a-z]+)5" は最初のグループをキャプチャします。castType=VT_STRING は結果を文字列として比較します。
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter(
        "col2",
        regexRule,
        SingleColumnValueRegexFilter.CompareOperator.EQUAL,
        ColumnValue.fromString("aaa"));
criteria.setFilter(filter);

GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());

論理演算子による複数フィルターの組み合わせ

複数のフィルターを論理演算子で組み合わせるには、CompositeColumnValueFilter を使用します。 複合フィルターはネストできます。 次の例では、条件 (col1 == "val1" OR cast<String>(reg(col2)) >= "aaa") AND col3 == "val3" を構築します。

RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");

PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());

PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());

criteria.setMaxVersions(1);

// リーフ 1: col1 == "val1"
SingleColumnValueFilter leaf1 = new SingleColumnValueFilter(
        "col1",
        SingleColumnValueFilter.CompareOperator.EQUAL,
        ColumnValue.fromString("val1"));

// リーフ 2: cast<String>(reg(col2)) >= "aaa"
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter leaf2 = new SingleColumnValueRegexFilter(
        "col2",
        regexRule,
        SingleColumnValueRegexFilter.CompareOperator.GREATER_EQUAL,
        ColumnValue.fromString("aaa"));

// OR の組み合わせ: リーフ 1 OR リーフ 2
CompositeColumnValueFilter orFilter = new CompositeColumnValueFilter(
        CompositeColumnValueFilter.LogicOperator.OR);
orFilter.addFilter(leaf1);
orFilter.addFilter(leaf2);

// リーフ 3: col3 == "val3"
SingleColumnValueFilter leaf3 = new SingleColumnValueFilter(
        "col3",
        SingleColumnValueFilter.CompareOperator.EQUAL,
        ColumnValue.fromString("val3"));

// AND の組み合わせ: (リーフ 1 OR リーフ 2) AND リーフ 3
CompositeColumnValueFilter andFilter = new CompositeColumnValueFilter(
        CompositeColumnValueFilter.LogicOperator.AND);
andFilter.addFilter(orFilter);
andFilter.addFilter(leaf3);

criteria.setFilter(andFilter);

GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());

欠損列と履歴バージョンの評価の制御

setPassIfMissing は対象列を含まない行が返されるかどうかを制御し、setLatestVersionsOnly は履歴バージョンも評価されるかどうかを制御します。

SingleColumnValueFilter filter = new SingleColumnValueFilter(
        "col1",
        SingleColumnValueFilter.CompareOperator.EQUAL,
        ColumnValue.fromString("val1"));

// col1 を含まない行をスキップします (デフォルト:そのような行を含める)。
filter.setPassIfMissing(false);
// すべてのバージョンを評価し、いずれかのバージョンが一致すれば行を返します (デフォルト:最新バージョンのみを評価)。
filter.setLatestVersionsOnly(false);

criteria.setFilter(filter);

属性列のページ取得

ColumnPaginationFilter を使用して、オフセットから始まる指定された数の属性列を返します。次の例では、最初の属性列をスキップし、次の 2 つの属性列を返します。

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("filter_demo", primaryKey);
criteria.setMaxVersions(1);
criteria.setFilter(new ColumnPaginationFilter(2, 1));

GetRowResponse response = client.getRow(new GetRowRequest(criteria));
for (Column column : response.getRow().getColumns()) {
    System.out.println(column.getName());
}