Tablestore SDK for Java を使用したブールクエリは、AND、OR、NOT ロジックを使用して複数のクエリ条件を組み合わせ、結合された条件に一致する行を返します。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
機能の説明
ブールクエリは BoolQuery を使用して、1 つ以上のサブクエリを複雑なクエリ条件に結合します。サブクエリには、別の BoolQuery を含む、任意の Query タイプを指定できます。
BoolQuery は、次の句のタイプをサポートしています。
-
mustQueries:行はすべてのサブクエリに一致する必要があります。一致するサブクエリは関連性スコアに影響します。この句のタイプは AND と同等です。 -
filterQueries:行はすべてのサブクエリに一致する必要がありますが、一致するサブクエリは関連性スコアに影響しません。この句のタイプも AND と同等です。 -
shouldQueries:行は、minShouldMatchで指定された最小数のサブクエリに一致する必要があります。より多くのサブクエリに一致すると、関連性スコアが高くなります。この句のタイプは OR と同等です。 -
mustNotQueries:行はどのサブクエリにも一致してはなりません。この句のタイプは NOT と同等であり、関連性スコアには影響しません。
minShouldMatch が設定されておらず、ブールクエリに shouldQueries と mustNotQueries のみが含まれている場合、少なくとも 1 つの shouldQueries サブクエリが一致する必要があります。ブールクエリに同じレベルの mustQueries または filterQueries が含まれている場合、shouldQueries サブクエリはデフォルトでオプションです。
search を呼び出してブールクエリを実行します。
SearchResponse search(SearchRequest request)
次の例では、city が hangzhou と等しく、category が book と等しい行をクエリします。このクエリは最大 10 行と一致する合計数を返します。
String tableName = "example_table";
String indexName = "example_index";
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(Arrays.asList(cityQuery, categoryQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
searchQuery.setLimit(10);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
System.out.println(response.getRows());
パラメーター
検索リクエスト
request は、次のパラメーターを含む SearchRequest オブジェクトです。
|
名前 |
タイプ |
説明 |
|
tableName (必須) |
String |
データテーブルの名前。 |
|
indexName (必須) |
String |
検索インデックスの名前。 |
|
searchQuery (必須) |
SearchQuery |
クエリ条件と一般的なクエリ設定。 |
|
columnsToGet (任意) |
SearchRequest.ColumnsToGet |
返す列。このパラメーターが設定されていない場合、プライマリキー列のみが返されます。 |
|
timeoutInMillisecond (任意) |
int |
リクエストレベルのクエリタイムアウト (ミリ秒単位)。デフォルト値は |
|
routingValues (任意) |
|
カスタムルートフィールドに対応するプライマリキー値。カスタムルーティングが設定されていない場合は、このパラメーターを設定しないでください。 |
クエリ設定
request.searchQuery は、次のパラメーターを含む SearchQuery オブジェクトです。
|
名前 |
タイプ |
説明 |
|
query (必須) |
Query |
クエリ条件。ブールクエリの場合は、このパラメーターを |
|
offset (任意) |
Integer |
クエリの開始位置。 |
|
limit (任意) |
Integer |
返す行の最大数。このパラメーターを |
|
highlight (任意) |
Highlight |
サブクエリが Text フィールドに一致する場合のまとめとハイライトの設定。設定の詳細については、「まとめとハイライト」をご参照ください。 |
|
collapse (任意) |
Collapse |
フィールドの折りたたみ設定。指定されたフィールドで結果を重複排除します。設定の詳細については、「クエリ結果の折りたたみ」をご参照ください。 |
|
sort (任意) |
Sort |
結果のソート順。設定の詳細については、「結果のソートとページネーション」をご参照ください。 |
|
trackTotalCount (任意) |
int |
カウントする一致行の予想最大数。デフォルト値は |
|
filter (任意) |
SearchFilter |
|
|
aggregationList (任意) |
|
集約設定。設定の詳細については、「集約」をご参照ください。 |
|
groupByList (任意) |
|
グループ化設定。設定の詳細については、「集約」をご参照ください。 |
|
token (任意) |
byte[] |
ページネーショントークン。このパラメーターを前の応答の |
ブールクエリ条件
request.searchQuery.query は、次のパラメーターを含む BoolQuery オブジェクトです。
|
名前 |
タイプ |
説明 |
|
mustQueries (任意) |
|
行がすべて一致する必要があるサブクエリ。一致するサブクエリは関連性スコアに影響します。この句のタイプは AND と同等です。 |
|
filterQueries (任意) |
|
行がすべて一致する必要があるサブクエリ。一致するサブクエリは関連性スコアに影響しません。この句のタイプは AND と同等です。 |
|
shouldQueries (任意) |
|
指定された最小数が一致する必要があるサブクエリ。この句のタイプは OR と同等です。より多くのサブクエリに一致すると、関連性スコアが高くなります。 |
|
mustNotQueries (任意) |
|
いずれも一致してはならないサブクエリ。この句のタイプは NOT と同等であり、関連性スコアには影響しません。 |
|
minShouldMatch (任意) |
String または int |
一致する必要がある |
|
weight (任意) |
Float |
ブールクエリの重み。このパラメーターを省略した場合、クエリは |
setMinimumShouldMatch(Integer) は非推奨です。setMinShouldMatch(int) または setMinShouldMatch(String) を使用してください。
返される列
request.columnsToGet は、次のパラメーターを含む SearchRequest.ColumnsToGet オブジェクトです。
|
名前 |
タイプ |
説明 |
|
columns (任意) |
|
返す属性列。 |
|
returnAll (任意) |
boolean |
データテーブルからすべての属性列を返すかどうかを指定します。デフォルト値は |
|
returnAllFromIndex (任意) |
boolean |
インデックス付けされたすべての属性列を返すかどうかを指定します。デフォルト値は |
戻り値
検索応答
search は SearchResponse オブジェクトを返します。次の表に、コアフィールドを示します。
|
名前 |
タイプ |
説明 |
|
totalCount |
long |
一致する行の数。 |
|
rows |
|
このクエリによって返された行。 |
|
searchHits |
|
クエリヒット。 |
|
nextToken |
byte[] |
次のページのトークン。 |
|
isAllSuccess |
boolean |
すべてのインデックスパーティションが正常にクエリされたかどうかを示します。 |
検索ヒット
response.searchHits[] は、次のコアフィールドを含む SearchHit オブジェクトです。
|
名前 |
タイプ |
説明 |
|
row |
Row |
一致する行。 |
|
score |
Double |
関連性スコア。 |
|
highlightResultItem |
HighlightResultItem |
まとめとハイライトの結果。 |
シナリオ例
いずれかの条件に一致
shouldQueries を使用して条件を組み合わせ、minShouldMatch を使用して一致する必要がある条件の最小数を指定します。次の例では、city が hangzhou と等しいか、category が book と等しい行をクエリします。
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setShouldQueries(Arrays.asList(cityQuery, categoryQuery));
boolQuery.setMinShouldMatch(1);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
条件に一致する行を除外
mustNotQueries を使用して、指定されたいずれかの条件に一致する行を除外します。次の例では、city が hangzhou と等しくない行をクエリします。
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustNotQueries(Collections.singletonList(cityQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
関連性スコアなしで複数の条件でフィルタリング
filterQueries を使用して、条件が関連性スコアに影響を与えないようにしながら、すべてのサブクエリが一致するように要求します。次の例では、city が hangzhou と等しく、category が book と等しい行をクエリします。
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setFilterQueries(Arrays.asList(cityQuery, categoryQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
条件の組み合わせをネスト
別の BoolQuery のサブクエリとして BoolQuery を使用して、複数レベルのロジックを表現します。次の例では、(city = "hangzhou" OR price < 150) OR (category = "book" AND (price = 300 OR price = 400)) を実装します。
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
RangeQuery lowPriceQuery = new RangeQuery();
lowPriceQuery.setFieldName("price");
lowPriceQuery.lessThan(ColumnValue.fromLong(150));
BoolQuery firstGroup = new BoolQuery();
firstGroup.setShouldQueries(Arrays.asList(cityQuery, lowPriceQuery));
TermQuery price300Query = new TermQuery();
price300Query.setFieldName("price");
price300Query.setTerm(ColumnValue.fromLong(300));
TermQuery price400Query = new TermQuery();
price400Query.setFieldName("price");
price400Query.setTerm(ColumnValue.fromLong(400));
BoolQuery priceGroup = new BoolQuery();
priceGroup.setShouldQueries(Arrays.asList(price300Query, price400Query));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery secondGroup = new BoolQuery();
secondGroup.setMustQueries(Arrays.asList(categoryQuery, priceGroup));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setShouldQueries(Arrays.asList(firstGroup, secondGroup));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);