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

Tablestore:ブールクエリ

最終更新日:Dec 28, 2024

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

前提条件

パラメーター

パラメーター

説明

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に設定すると、すべての列が返されます。

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

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

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

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

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

/**
 * すべてのサブクエリの条件を満たす行をクエリするブールクエリを実行します。
 * @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 or col3<5) or (col2 = 4 and (col3 = 5 or col3 =6)) というサブクエリの条件の組み合わせを満たす行をクエリするブールクエリを実行する方法の例を示しています。上記のサブクエリの条件の組み合わせでは、ブールサブクエリはAND演算子またはOR演算子で接続されています。

/**
 * (col2<4 or col3<5) or (col2 = 4 and (col3 = 5 or 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

関連情報