Tablestore SDK for Java でクエリ後フィルターを使用すると、メインクエリの結果をさらにフィルター処理し、後で実行するのに適した条件をメインクエリから分離できます。
前提条件
-
Tablestore SDK for Java をインストールし、クライアントを初期化していること。
-
Tablestore SDK for Java 5.17.5 以降を使用していること。
仕組み
クエリ後フィルター (SearchFilter) は、メインクエリ (query) の実行後に候補行をさらにフィルター処理します。その後、フィルター処理された結果から集約とグループ化が計算されます。後で実行するのに適した条件をメインクエリから分離することで、メインクエリ中に複雑な条件を評価するコストを削減できます。実際のパフォーマンス上のメリットは、メインクエリとフィルター条件の選択性によって異なります。
クエリ後フィルターを使用するには、search を呼び出し、SearchQuery でメインクエリと SearchFilter を個別に構成します。メインクエリは、多次元インデックスが提供するクエリタイプをサポートします。クエリ後フィルターは、特定のクエリタイプとフィールドタイプのみをサポートします。詳細については、「制限事項」をご参照ください。
SearchResponse search(SearchRequest request)
次の例では、まず TermsQuery を使用して category フィールドの値が book である行をクエリします。次に、クエリ後フィルターを使用して、score_long フィールドの値が 1 より大きく 10 未満の行を保持します。
String tableName = "example_table";
String indexName = "example_index";
// Configure the main query.
TermsQuery termsQuery = new TermsQuery();
termsQuery.setFieldName("category");
termsQuery.addTerm(ColumnValue.fromString("book"));
// Configure the post-query filter.
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("score_long");
rangeQuery.setFrom(ColumnValue.fromLong(1));
rangeQuery.setIncludeLower(false);
rangeQuery.setTo(ColumnValue.fromLong(10));
rangeQuery.setIncludeUpper(false);
SearchFilter searchFilter = new SearchFilter();
searchFilter.setQuery(rangeQuery);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(termsQuery);
searchQuery.setFilter(searchFilter);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet =
new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAllFromIndex(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
System.out.println("Total count: " + response.getTotalCount());
System.out.println("Rows: " + response.getRows());
制限事項
-
クエリ後フィルターは、メインクエリと併用する必要があります。クエリ後フィルターが実行される前に候補行の数を減らすようにメインクエリを構成してください。多次元インデックス内のすべての行をフィルター処理する必要がある場合を除き、メインクエリを
MatchAllQueryに設定しないでください。 -
クエリ後フィルターは、
TermQuery、TermsQuery、RangeQuery、ExistsQuery、およびこれらのクエリタイプで構成されるBoolQuery条件のみをサポートします。 -
クエリ後フィルターとして使用される
BoolQueryでは、mustQueries、mustNotQueries、およびshouldQueriesのみがサポートされます。filterQueriesはサポートされていません。 -
フィルター処理できるのは、
Keyword、Long、およびDoubleフィールドのみです。これらのフィールドに対してenableSortAndAggを有効にする必要があります。 -
クエリ後フィルターの条件は、関連度スコアの計算には関与しません。フィルター条件に
weightを設定しても、クエリ結果の関連度スコアは変更されません。
パラメーター
検索リクエスト
request は、次のパラメーターを含む SearchRequest オブジェクトです。
|
名前 |
型 |
説明 |
|
tableName (必須) |
String |
テーブルの名前。 |
|
indexName (必須) |
String |
検索インデックスの名前 |
|
searchQuery (必須) |
SearchQuery |
メインクエリ、クエリ後フィルター、および共通のクエリ設定。 |
|
columnsToGet (任意) |
SearchRequest.ColumnsToGet |
返される列。このパラメーターが指定されていない場合、プライマリキー列のみが返されます。 |
|
timeoutInMillisecond (任意) |
int |
リクエストレベルのクエリタイムアウト (ミリ秒単位)。デフォルト値は |
|
routingValues (任意) |
|
カスタムルーティングフィールドのプライマリキー値。カスタムルーティングを使用しない場合は、このパラメーターを構成する必要はありません。 |
クエリ設定
request.searchQuery は、次のパラメーターを含む SearchQuery オブジェクトです。
|
名前 |
型 |
説明 |
|
query (必須) |
Query |
メインクエリの条件。多次元インデックスのクエリタイプがサポートされています。 |
|
filter (必須) |
SearchFilter |
メインクエリの実行後に候補行をさらにフィルター処理するクエリ後フィルター。 |
|
offset (任意) |
Integer |
クエリを開始するオフセット。 |
|
limit (任意) |
Integer |
返される行の最大数。このパラメーターを |
|
highlight (任意) |
Highlight |
|
|
collapse (任意) |
Collapse |
フィールドによってクエリ結果を重複排除するために使用されるフィールドの折りたたみ設定。構成の詳細については、「クエリ結果の折りたたみ」をご参照ください。 |
|
sort (任意) |
Sort |
クエリ結果のソート順。構成の詳細については、「結果のソートとページ分割」をご参照ください。 |
|
trackTotalCount (任意) |
int |
カウントする一致行の最大数。デフォルト値は |
|
aggregationList (任意) |
|
集約設定。集約は、クエリ後フィルターの結果から計算されます。構成の詳細については、「集約」をご参照ください。 |
|
groupByList (任意) |
|
グループ化設定。グループ化は、クエリ後フィルターの結果から計算されます。構成の詳細については、「集約」をご参照ください。 |
|
token (任意) |
byte[] |
ページネーショントークン。次のページを読み取るには、このパラメーターを前のリクエストによって返された |
クエリ後フィルター
request.searchQuery.filter は、次のパラメーターを含む SearchFilter オブジェクトです。
|
名前 |
型 |
説明 |
|
query (必須) |
Query |
フィルター条件。 |
返される列
request.columnsToGet は、次のパラメーターを含む SearchRequest.ColumnsToGet オブジェクトです。
|
名前 |
型 |
説明 |
|
columns (任意) |
|
返される属性列。このパラメーターは、 |
|
returnAll (任意) |
boolean |
テーブル内のすべての属性列を返すかどうかを指定します。デフォルト値: |
|
returnAllFromIndex (任意) |
boolean |
インデックス付けされたすべての属性列を返すかどうかを指定します。デフォルト値: |
応答
search は SearchResponse オブジェクトを返します。次の表に、コアフィールドを示します。
|
名前 |
型 |
説明 |
|
totalCount |
long |
クエリ後フィルターに一致する行の数。 |
|
rows |
|
現在のリクエストによって返された行。 |
|
searchHits |
|
検索ヒット。 |
|
aggregationResults |
AggregationResults |
クエリ後フィルターの結果から計算された集約結果。 |
|
groupByResults |
GroupByResults |
クエリ後フィルターの結果から計算されたグループ化の結果。 |
|
nextToken |
byte[] |
次のページのトークン。 |
|
isAllSuccess |
boolean |
すべてのインデックスパーティションがクエリされたかどうかを示します。 |