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

Tablestore:ブールクエリ

最終更新日:Dec 28, 2024

ブールクエリは、サブクエリの組み合わせに基づいてデータテーブル内のデータを取得します。Tablestoreは、サブクエリの条件を満たす行を返します。サブクエリは、ブールクエリを含む任意のタイプにすることができます。

API操作

SearchまたはParallelScan操作を呼び出し、クエリタイプをBoolQueryに設定して、ブールクエリを実行できます。

パラメータ

パラメータ

説明

mustQueries

サブクエリのリスト。すべてのサブクエリの条件を満たす行のみが返されます。このパラメータはAND演算子と同等です。

mustNotQueries

サブクエリのリスト。サブクエリの条件を満たさない行のみが返されます。このパラメータはNOT演算子と同等です。

filterQueries

サブクエリのリスト。すべてのサブフィルタを満たす行のみが返されます。フィルタはクエリに似ていますが、行が満たすサブフィルタの数に基づいて、フィルタでは関連性スコアが計算されない点が異なります。

shouldQueries

クエリ結果が一致する、または一致しない可能性のあるサブクエリのリスト。このパラメータはOR演算子と同等です。

shouldQueriesパラメータで指定された最小数のサブクエリの条件を満たす行のみが返されます。

全体的な関連性スコアが高いほど、shouldQueriesパラメータで指定されたサブクエリの条件が多く満たされていることを示します。

minimumShouldMatch

返される行が満たす必要がある、shouldQueriesパラメータで指定されたサブクエリの条件の最小数。 shouldQueriesパラメータで指定されたサブクエリの条件以外のサブクエリの条件が指定されていない場合、minimumShouldMatchパラメータのデフォルト値は1です。 mustQueries、mustNotQueries、filterQueriesパラメータで指定されたサブクエリの条件など、他のサブクエリの条件が指定されている場合、minimumShouldMatchパラメータのデフォルト値は0です。

getTotalCount

クエリ条件を満たす行の総数を返すかどうかを指定します。このパラメータのデフォルト値はfalseで、クエリ条件を満たす行の総数は返されないことを指定します。

このパラメータをtrueに設定すると、クエリのパフォーマンスが低下します。

tableName

データテーブルの名前。

indexName

検索インデックスの名前。

columnsToGet

クエリ条件を満たす各行のすべての列を返すかどうかを指定します。このパラメータには、returnAllフィールドとcolumnsフィールドを設定できます。

returnAllフィールドのデフォルト値はfalseで、すべての列が返されないことを指定します。この場合、columnsフィールドを使用して、返す列を指定できます。返す列を指定しない場合は、プライマリキー列のみが返されます。

returnAllフィールドをtrueに設定すると、すべての列が返されます。

メソッド

Tablestoreコンソール、Tablestore CLI、またはTablestore SDKを使用して、ブールクエリを実行できます。ブールクエリを実行する前に、以下の準備が整っていることを確認してください。

Tablestoreコンソールの使用

  1. インデックスタブに移動します。

    1. Tablestoreコンソールにログオンします。

    2. 上部のナビゲーションバーで、リソースグループとリージョンを選択します。

    3. 概要ページで、管理するインスタンスの名前をクリックするか、インスタンスのアクション列のインスタンスの管理をクリックします。

    4. インスタンスの詳細タブのテーブルタブで、データテーブルの名前をクリックするか、データテーブルのアクション列のインデックスをクリックします。

  2. インデックスタブで、データのクエリに使用する検索インデックスを見つけ、アクション列のデータの管理をクリックします。

  3. 検索ダイアログボックスで、クエリ条件を指定します。

    1. デフォルトでは、システムはすべての属性列を返します。特定の属性列を返すには、すべての列をオフにして、返す属性列を指定します。複数の属性列はコンマ(,)で区切ります。

      説明

      デフォルトでは、システムはデータテーブルのすべてのプライマリキー列を返します。

    2. ビジネス要件に基づいて、AndOr、またはNot論理演算子を選択します。

      And論理演算子を選択すると、クエリ条件を満たすデータが返されます。 Or演算子を選択して単一のクエリ条件を指定すると、そのクエリ条件を満たすデータが返されます。 Or論理演算子を選択して複数のクエリ条件を指定すると、クエリ条件のいずれかを満たすデータが返されます。 Not論理演算子を選択すると、クエリ条件を満たさないデータが返されます。

    3. インデックスフィールドを選択し、追加をクリックします。次に、クエリタイプと値のパラメータを設定します。

      この手順を繰り返して、複数のインデックスフィールドのクエリ条件を追加できます。

    4. デフォルトでは、ソート機能は無効になっています。特定のフィールドに基づいてクエリ結果をソートする場合は、ソートをオンにして、クエリ結果をソートするフィールドとソート順を指定します。

    5. デフォルトでは、集計機能は無効になっています。特定のフィールドの統計を収集する場合は、統計を収集をオンにして、統計を収集するフィールドを指定し、統計を収集するために必要な情報を設定します。

  4. OKをクリックします。

    クエリ条件を満たすデータが、指定された順序でインデックスタブに表示されます。

Tablestore CLIの使用

Tablestore CLIを使用してsearchコマンドを実行し、検索インデックスを使用してデータをクエリできます。詳細については、検索インデックスを参照してください。

  1. searchコマンドを実行して、search_index検索インデックスを使用してデータをクエリし、クエリ条件を満たす各行のすべてのインデックス付き列を返します。

    search -n search_index --return_all_indexed
  2. プロンプトが表示されたら、クエリ条件を入力します。

    {
        "Offset": -1,
        "Limit": 10,
        "Collapse": null,
        "Sort": null,
        "GetTotalCount": true,
        "Token": null,
        "Query": {
            "Name": "BoolQuery",
            "Query": {
                "MinimumShouldMatch": null,
                "MustQueries": null,
                "MustNotQueries": null,
                "FilterQueries": null,
                "ShouldQueries": [{
                    "Name": "RangeQuery",
                    "Query": {
                        "FieldName": "gid",
                        "From": null,
                        "To": 10,
                        "IncludeLower": false,
                        "IncludeUpper": false
                    }
                }, {
                    "Name": "TermQuery",
                    "Query": {
                        "FieldName": "gid",
                        "Term": 77
                    }
                }]
            }
        },
        "Aggregations": [{
            "Name": "avg",
            "Aggregation": {
                "AggName": "agg1",
                "Field": "gid",
                "MissingValue": null
            }
        }]
    }

Tablestore SDKの使用

次のTablestore SDKを使用して、ブールクエリを実行できます。Tablestore SDK for JavaTablestore SDK for GoTablestore SDK for PythonTablestore SDK for Node.jsTablestore SDK for .NETTablestore SDK for PHP。この例では、Tablestore SDK for Javaを使用します。

次の例は、ブールクエリを実行する方法を示しています。

すべてのサブクエリの条件を満たす行をクエリする

すべてのサブクエリの条件を満たす行をクエリする場合、ビジネス要件に基づいて、行の関連性スコアを計算するかどうかを決定できます。

行の関連性スコアを計算する

次のサンプルコードは、ブールクエリを実行してすべてのサブクエリの条件を満たす行をクエリし、行の関連性スコアを計算する方法の例を示しています。

/**
 * ブールクエリを実行して、すべてのサブクエリの条件を満たす行をクエリします。
 * @param client
 */
public static void andQuery(SyncClient client){
    /**
     * 条件1:範囲クエリを実行して、Col_Long列の値が3より大きい行をクエリします。
     */
    RangeQuery rangeQuery = new RangeQuery();
    rangeQuery.setFieldName("Col_Long");
    rangeQuery.greaterThan(ColumnValue.fromLong(3));

    /**
     * 条件2:一致クエリを実行して、Col_Keyword列の値がhangzhouである行をクエリします。
     */
    MatchQuery matchQuery = new MatchQuery();
    matchQuery.setFieldName("Col_Keyword");
    matchQuery.setText("hangzhou");

    SearchQuery searchQuery = new SearchQuery();
    {
        /**
         * 条件1と条件2の両方を満たすクエリ結果を持つブールクエリを構築します。
         */
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustQueries(Arrays.asList(rangeQuery, matchQuery));
        searchQuery.setQuery(boolQuery);
        //searchQuery.setGetTotalCount(true);// GetTotalCountパラメータをtrueに設定して、クエリ条件を満たす行の総数を返します。

        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // columnsToGetパラメータを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメータを設定しない場合は、プライマリキー列のみが返されます。
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // ReturnAllパラメータをtrueに設定して、すべての列を返します。
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // 返す列を指定します。
        //searchRequest.setColumnsToGet(columnsToGet);

        SearchResponse resp = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // 返される行数ではなく、クエリ条件を満たす行の総数を表示するように指定します。
        System.out.println("Row: " + resp.getRows());
    }
}

行の関連性スコアを計算しない

次のサンプルコードは、ブールクエリを実行してすべてのサブクエリの条件を満たす行をクエリし、行の関連性スコアを計算しない方法の例を示しています。

/**
     * ブールクエリを実行して、すべてのサブクエリの条件を満たす行をクエリし、行の関連性スコアを計算しません.
     * @param client
     */
    public static void filtersQuery(SyncClient client){
        /**
         * 条件1:範囲クエリを実行して、Col_Long列の値が3より大きい行をクエリします。
         */
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.setFieldName("Col_Long");
        rangeQuery.greaterThan(ColumnValue.fromLong(3));

        /**
         * 条件2:一致クエリを実行して、Col_Keyword列の値がhangzhouである行をクエリします。
         */
        MatchQuery matchQuery = new MatchQuery();
        matchQuery.setFieldName("Col_Keyword");
        matchQuery.setText("hangzhou");

        SearchQuery searchQuery = new SearchQuery();
        {
            /**
             * 条件1と条件2の両方を満たすクエリ結果を持つブールクエリを構築します。
             */
            BoolQuery boolQuery = new BoolQuery();
            boolQuery.setFilterQueries(Arrays.asList(rangeQuery, matchQuery));
            searchQuery.setQuery(boolQuery);
            //searchQuery.setGetTotalCount(true);// GetTotalCountパラメータをtrueに設定して、クエリ条件を満たす行の総数を返します。

            SearchRequest searchRequest = new SearchRequest("sampleTable", "sampleSearchIndex", searchQuery);
            // columnsToGetパラメータを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメータを設定しない場合は、プライマリキー列のみが返されます。
            //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
            //columnsToGet.setReturnAll(true); // ReturnAllパラメータをtrueに設定して、すべての列を返します。
            //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // 返す列を指定します。
            //searchRequest.setColumnsToGet(columnsToGet);

            SearchResponse resp = client.search(searchRequest);
            //System.out.println("TotalCount: " + resp.getTotalCount()); // 返される行数ではなく、クエリ条件を満たす行の総数を表示するように指定します。
            System.out.println("Row: " + resp.getRows());
        }
    }

少なくとも1つのサブクエリの条件を満たす行をクエリする

次のサンプルコードは、ブールクエリを実行して、指定されたサブクエリの条件の少なくとも1つを満たす行をクエリする方法の例を示しています。

/**
 * ブールクエリを実行して、指定されたサブクエリの条件の少なくとも1つを満たす行をクエリします。
 * @param client
 */
public static void orQuery(SyncClient client) {

    /**
     * 条件1:範囲クエリを実行して、Col_Long列の値が3より大きい行をクエリします。
     */
    RangeQuery rangeQuery = new RangeQuery();
    rangeQuery.setFieldName("Col_Long");
    rangeQuery.greaterThan(ColumnValue.fromLong(3));

    /**
     * 条件2:一致クエリを実行して、Col_Keyword列の値がhangzhouである行をクエリします。
     */
    MatchQuery matchQuery = new MatchQuery();
    matchQuery.setFieldName("Col_Keyword");
    matchQuery.setText("hangzhou");

    SearchQuery searchQuery = new SearchQuery();
    {
    /**
     * 条件1または条件2の少なくとも1つを満たすクエリ結果を持つブールクエリを構築します。
     */
    BoolQuery boolQuery = new BoolQuery();
    boolQuery.setShouldQueries(Arrays.asList(rangeQuery, matchQuery));
    boolQuery.setMinimumShouldMatch(1); // 結果が少なくとも1つのサブクエリの条件を満たすように指定します。
    searchQuery.setQuery(boolQuery);
    //searchQuery.setGetTotalCount(true);// GetTotalCountパラメータをtrueに設定して、クエリ条件を満たす行の総数を返します。

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // columnsToGetパラメータを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメータを設定しない場合は、プライマリキー列のみが返されます。
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // ReturnAllパラメータをtrueに設定して、すべての列を返します。
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // 返す列を指定します。
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // 返される行数ではなく、クエリ条件を満たす行の総数を表示するように指定します。
    System.out.println("Row: " + resp.getRows());
    }
}

サブクエリの条件を満たさない行をクエリする

次のサンプルコードは、ブールクエリを実行して、サブクエリの条件を満たさない行をクエリする方法の例を示しています。

/**
 * ブールクエリを実行して、サブクエリの条件を満たさない行をクエリします。
 * @param client
 */
public static void notQuery(SyncClient client) {

    /**
     * 条件1:一致クエリを実行して、Col_Keyword列の値がhangzhouである行をクエリします。
     */
    MatchQuery matchQuery = new MatchQuery();
    matchQuery.setFieldName("Col_Keyword");
    matchQuery.setText("hangzhou");

    SearchQuery searchQuery = new SearchQuery();
    {
        /**
         * 条件1を満たさないクエリ結果を持つブールクエリを構築します。
         */
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustNotQueries(Arrays.asList(matchQuery));
        searchQuery.setQuery(boolQuery);
        //searchQuery.setGetTotalCount(true);// GetTotalCountパラメータをtrueに設定して、クエリ条件を満たす行の総数を返します。

        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // columnsToGetパラメータを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメータを設定しない場合は、プライマリキー列のみが返されます。
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // ReturnAllパラメータをtrueに設定して、すべての列を返します。
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // 返す列を指定します。
        //searchRequest.setColumnsToGet(columnsToGet);

        SearchResponse resp = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // 返される行数ではなく、クエリ条件を満たす行の総数を表示するように指定します。
        System.out.println("Row: " + resp.getRows());
    }
}

サブクエリの条件の組み合わせを満たす行をクエリする

次のサンプルコードは、ブールクエリを実行して、サブクエリの条件の組み合わせ(col2<4またはcol3<5)または(col2 = 4かつ(col3 = 5またはcol3 =6))を満たす行をクエリする方法の例を示しています。上記のサブクエリの条件の組み合わせでは、ブールサブクエリはANDまたはOR演算子で接続されています。

/**
 * (col2<4またはcol3<5)または(col2 = 4かつ(col3 = 5またはcol3 =6))
 * ブールサブクエリはANDまたはOR演算子で接続されています。
 * @param client
*/
private static void boolQuery2(SyncClient client){
        // 条件1:col2列の値が4未満です。
        RangeQuery rangeQuery1 = new RangeQuery();
        rangeQuery1.setFieldName("col2");
        rangeQuery1.lessThan(ColumnValue.fromLong(4));

        // 条件2:col3列の値が5未満です。
        RangeQuery rangeQuery2 = new RangeQuery();
        rangeQuery2.setFieldName("col3");
        rangeQuery2.lessThan(ColumnValue.fromLong(5));

        // 条件3:col2列の値が4と等しいです。
        TermQuery termQuery = new TermQuery();
        termQuery.setFieldName("col2");
        termQuery.setTerm(ColumnValue.fromLong(4));

        // 条件4:col3列の値が5と等しいか、col3列の値が6と等しいです。
        TermsQuery termsQuery = new TermsQuery();
        termsQuery.setFieldName("col3");
        termsQuery.addTerm(ColumnValue.fromLong(5));
        termsQuery.addTerm(ColumnValue.fromLong(6));

        SearchQuery searchQuery = new SearchQuery();

        List<Query> queryList1 = new ArrayList<>();
        queryList1.add(rangeQuery1);
        queryList1.add(rangeQuery2);

        // 複合条件1:col2列の値が4未満であるか、col3列の値が5未満です。
        BoolQuery boolQuery1 = new BoolQuery();
        boolQuery1.setShouldQueries(queryList1);

        // 複合条件2:col2列の値が4と等しく、col3列の値が5または6と等しいです。
        List<Query> queryList2 = new ArrayList<>();
        queryList2.add(termQuery);
        queryList2.add(termsQuery);

        BoolQuery boolQuery2 = new BoolQuery();
        boolQuery2.setMustQueries(queryList2);

        // 複合条件:col2列の値が4未満であるか、col3列の値が5未満であるか、col2列の値が4と等しく、col3列の値が5または6と等しいです。

        List<Query> queryList3 = new ArrayList<>();
        queryList3.add(boolQuery1);
        queryList3.add(boolQuery2);

        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setShouldQueries(queryList3);

        searchQuery.setQuery(boolQuery);
        //searchQuery.setGetTotalCount(true);// GetTotalCountパラメータをtrueに設定して、クエリ条件を満たす行の総数を返します。

        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // columnsToGetパラメータを設定して、返す列を指定するか、すべての列を返すように指定できます。このパラメータを設定しない場合は、プライマリキー列のみが返されます。
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // ReturnAllパラメータをtrueに設定して、すべての列を返します。
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // 返す列を指定します。
        //searchRequest.setColumnsToGet(columnsToGet);

        SearchResponse response = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // 返される行数ではなく、クエリ条件を満たす行の総数を表示するように指定します。
        System.out.println(response.getRows());

    }

請求ルール

検索インデックスを使用してデータをクエリする場合、消費された読み取りスループットに対して課金されます。詳細については、検索インデックスの課金対象項目を参照してください。

FAQ

参考資料