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

Tablestore:フィルターの設定

最終更新日:Dec 28, 2024

フィルターを設定すると、Tablestore はサーバー上でクエリ結果をフィルタリングします。フィルター条件に一致する行のみが返されます。

前提条件

使用上の注意

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

行に参照列が存在しない場合に、行を返すかどうかを指定します。有効な値:

  • true (デフォルト): 行に参照列が存在しない場合、行は返されます。

  • false: 行に参照列が存在しない場合、行は返されません。

LatestVersionsOnly

参照列に複数バージョンのデータが含まれている場合、比較に参照列の最新バージョンのデータのみを使用するかどうかを指定します。有効な値:

  • true (デフォルト): 参照列に複数バージョンのデータが含まれている場合、最新バージョンのデータのみが比較に使用されます。

  • false: 参照列に複数バージョンのデータが含まれている場合、すべてのバージョンのデータが比較に使用されます。参照列のいずれかのバージョンのデータがフィルター条件を満たす場合、行は返されます。

Regex

サブフィールド値の照合に使用される正規表現。正規表現は、以下の条件を満たす必要があります。

  • 正規表現の長さは最大 256 バイトです。

  • Perl の正規表現の構文がサポートされています。

  • シングルバイトの正規表現がサポートされています。

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

  • 正規表現の完全一致モードと部分一致モードがサポートされています。

    部分一致モードでは、一致させるサブフィールド値は、正規表現で括弧 () で囲まれています。

    完全一致モードが使用される場合、最初の一致結果が返されます。部分一致モードが使用される場合、最初の部分一致結果が返されます。たとえば、列値が 1aaa51bbb5 で、正規表現が 1[a-z]+5 の場合、戻り値は 1aaa5 です。正規表現が 1([a-z]+)5 の場合、戻り値は aaa です。

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 クエリ機能を使用して、テーブル内のデータをクエリおよび分析できます。詳細については、データのクエリを参照してください。