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

Tablestore:フィルター

最終更新日:May 12, 2026

フィルターは、サーバー側で読み取り結果をフィルタリングでき、定義した条件に一致する行のみを返します。このアプローチにより、ネットワークのデータ転送量が削減され、応答時間が短縮されます。

ユースケース

  • 結果の直接フィルタリング

    IoT シナリオにおけるスマートメーターを例に考えてみましょう。メーターは、電圧、アンペア数、使用量などのデータを、たとえば 15 秒ごとなどの固定頻度で Tablestore に書き込みます。日次分析では、メーターに電圧の異常が発生したかどうかを特定し、その時点の他のステータスデータを取得して、電力線の点検が必要かどうかを判断する必要があります。

    フィルターがない場合、GetRange 操作を使用して、1 つのメーターの 1 日分の監視記録 5,760 件すべてを読み込むことになります。その後、クライアント側でこれら 5,760 件のレコードを処理して、電圧の不安定性を示す 10 件のレコードを見つける必要があります。

    フィルターを使用すると、サーバーは必要な 10 件のレコードのみを返します。このアプローチにより、データ転送量が大幅に削減され、クライアント側のフィルタリングが不要になるため、開発コストを節約できます。

  • 正規表現と型変換によるフィルタリング

    列にカスタム形式 (JSON 形式の文字列など) でデータが格納されている場合、その文字列内のサブフィールドに基づいてフィルタリングできます。これを行うには、正規表現を使用してサブフィールドの値を照合して抽出し、目的のデータ型に変換してから、フィルターを適用します。

    たとえば、ある列に {cluster_name:name1,lastupdatetime:12345} という形式でデータが格納されているとします。lastupdatetime>12345 となる行をクエリするには、正規表現 lastupdatetime:([0-9]+)} を使用してサブフィールドの値を抽出します。その後、抽出した値を数値型に変換し、比較を行って目的の行を見つけることができます。

概要

GetRowBatchGetRow、または GetRange 操作でフィルターを使用して、指定した条件を満たす行のみを返すことができます。フィルターは、これらの操作のネイティブのセマンティクスや制限を変更しません。詳細については、「データ読み込み」をご参照ください。

フィルターには、次の設定オプションがあります。

  • PassIfMissing パラメーターを使用して、参照する列が行に存在しない場合のフィルターの動作を指定します。

  • 参照する列に複数のバージョンがある場合、最新バージョンの値のみを比較するようにフィルターを設定できます。

  • 正規表現を使用して、サブフィールドの値を照合します。

  • 関係演算子と論理演算子を使用して、複合的なフィルター条件を構築します。

Tablestore は、SingleColumnValueFilter、SingleColumnValueRegexFilter、および CompositeColumnValueFilter を提供しています。これらのフィルターは、1 つ以上の参照する列の値に基づいて行を返すかどうかを決定します。

フィルター

説明

SingleColumnValueFilter

単一の参照列の値に基づいて行をフィルタリングします。

SingleColumnValueRegexFilter

正規表現を使用して、文字列型の列内の部分文字列を照合できます。その後、照合した部分文字列を文字列、整数、または double にキャストし、変換後の値に基づいてフィルタリングできます。

正規表現は、次の条件を満たす必要があります。

  • 長さは 256 バイトを超えることはできません。

  • Perl 正規表現構文をサポートしています。

  • シングルバイトの正規表現のみをサポートしています。

  • 中国語文字の正規表現マッチングはサポートされていません。

  • 完全一致モードと部分一致モードの両方がサポートされています。

    部分一致モードでは、抽出する部分文字列を括弧 (...) で囲みます。

    完全一致モードを使用した場合、最初に一致したものが返されます。正規表現に部分一致構文が含まれている場合、最初に一致してキャプチャされた部分文字列が返されます。たとえば、列の値が 1aaa51bbb5 で、正規表現が 1[a-z]+5 の場合、返される値は 1aaa5 です。正規表現が 1([a-z]+)5 の場合、返される値は aaa です。

    重要

    SingleColumnValueRegexFilter は、Tablestore SDK for Java でのみサポートされており、使用できるキャプチャグループは 1 つのみです。

CompositeColumnValueFilter

複数の列の条件を論理的に組み合わせて行をフィルタリングします。

注意事項

  • フィルター条件は、関係演算子 (=、!=、>、>=、<、<=) と論理演算子 (NOT、AND、OR) をサポートしています。最大 10 個の条件を組み合わせることができます。

  • フィルターで参照する列は、読み取りリクエストに含める必要があります。そうしないと、フィルターはその値にアクセスできません。

  • GetRange 操作を使用する場合、1 回のスキャンで 5,000 行または 4 MB のデータを超えることはできません。

    スキャンした 5,000 行または 4 MB のデータ内にフィルター条件に一致する行がない場合、応答の Rows フィールドは空になりますが、NextStartPrimaryKey は空でない可能性があります。この場合、返された NextStartPrimaryKey を使用して、空になるまで読み込みを続行する必要があります。

使用方法

重要

フィルターは SDK 経由でのみ使用できます。

フィルターは、Tablestore SDK for JavaTablestore SDK for GoTablestore SDK for PythonTablestore SDK for Node.jsTablestore SDK for .NET、およびTablestore SDK for PHPで使用できます。以下の例では、Tablestore SDK for Java を使用します。

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 AND Col1 > 100) OR (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);

    // 最新バージョンのみを読み取るようにクエリを設定します。
    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;
        }
    }
}

課金

フィルターは既存の課金ルールを変更しません。

フィルターは返されるデータ量を削減しますが、消費される読み込みキャパシティーユニット (CU) は削減しません。これは、フィルタリングがディスクからデータを読み取った後にサーバー上で実行されるため、ディスク I/O 操作の回数は変わらないためです。たとえば、GetRange 操作が合計 200 KB の 100 行を読み取り、50 読み込みキャパシティーユニット (CU) を消費する場合、フィルターを適用して 10 行 (20 KB) のみを返したとしても、消費される読み込みキャパシティーユニット (CU) は 50 のままです。

よくある質問

セカンダリインデックスと検索インデックスの選択

関連ドキュメント

  • アプリケーションがさまざまな属性に基づいてデータをクエリする必要がある場合は、これらの属性をセカンダリインデックスのプライマリキー列として定義することで、高速に検索できます。詳細については、「セカンダリインデックス」をご参照ください。

  • 非プライマリキー列でのクエリ、複合クエリ、あいまい検索などの多次元クエリや、集計、行数のカウント、データのグループ化などのデータ分析を必要とするビジネスシナリオでは、検索インデックスを使用できます。必要な属性を検索インデックスフィールドとして定義し、データのクエリと分析を行います。詳細については、「検索インデックス」をご参照ください。