ブールクエリは、サブクエリの組み合わせに基づいてデータテーブル内のデータを取得します。Tablestoreは、サブクエリの条件を満たす行を返します。サブクエリは、ブールクエリを含む任意のタイプにすることができます。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成およびデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
パラメーター
パラメーター | 説明 |
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
関連情報
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます:タームクエリ、タームズクエリ、すべて一致クエリ、一致クエリ、一致フレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、ジオクエリ、KNNベクトル検索クエリ、ブールクエリ、ネストクエリ、存在クエリ。検索インデックスを作成した後、検索インデックスが提供するクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングの実行を参照してください。
折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータはクエリ結果に1回だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
テーブル内のデータを分析する場合、Search操作を呼び出して集計機能を使用するか、SQLクエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、集計とSQLクエリを参照してください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合、ParallelScan操作とComputeSplits操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。