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

Tablestore:フィルターの使用

最終更新日:Aug 06, 2026

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

前提条件

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

説明

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

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

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

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

  • CompositeColumnValueFilter は、論理演算子 (ANDOR、または 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

評価演算子。有効な値: EQUALNOT_EQUALGREATER_THANGREATER_EQUALLESS_THANLESS_EQUALEXIST、および NOT_EXIST

columnValue (任意)

ColumnValue

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

latestVersionsOnly (任意)

boolean

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

複合フィルター

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

名前

説明

type (必須)

LogicOperator

論理演算子。有効値:

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

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

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

filters (必須)

List<ColumnValueFilter>

論理演算子によって結合されるサブフィルター。各サブフィルターは addFilter() で追加します。サブフィルターとして、SingleColumnValueFilterSingleColumnValueRegexFilter、または別の 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());
}