Tablestore SDK for Java を使用した多次元インデックスの範囲クエリは、フィールド値の上限と下限によってデータをフィルター処理し、各境界を含めるか除外するかを指定できます。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
機能の説明
範囲クエリは、インデックスフィールドの値が指定された間隔内にある行に一致します。下限のみ、上限のみ、または両方の境界を設定できます。少なくとも 1 つの境界が必要です。Text フィールドの場合、フィールド値から生成されたいずれかのトークンが間隔内にあると、行が一致します。
greaterThan、greaterThanOrEqual、lessThan、および lessThanOrEqual を使用して、より大きい、以上、より小さい、および以下の条件を指定します。search を呼び出すときに、クエリタイプを RangeQuery に設定します。
SearchResponse search(SearchRequest request)
次の例では、price フィールド内の Long 型の値で、半開区間 [100, 500) に含まれるものをクエリします。このクエリは最大 10 行を返し、一致した行の総数を取得します。
String tableName = "example_table";
String indexName = "example_index";
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("price");
rangeQuery.greaterThanOrEqual(ColumnValue.fromLong(100L));
rangeQuery.lessThan(ColumnValue.fromLong(500L));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(rangeQuery);
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.getTotalCount());
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 |
|
|
collapse (オプション) |
Collapse |
フィールドの折りたたみの設定。指定したフィールドで結果を重複排除します。構成の詳細については、「クエリ結果の折りたたみ」をご参照ください。 |
|
sort (オプション) |
Sort |
結果のソート順。構成の詳細については、「結果のソートとページ分割」をご参照ください。 |
|
trackTotalCount (オプション) |
int |
カウントする一致行の予想最大数。デフォルト値は |
|
filter (オプション) |
SearchFilter |
|
|
aggregationList (オプション) |
|
集約設定。構成の詳細については、「集約」をご参照ください。 |
|
groupByList (オプション) |
|
グループ化設定。構成の詳細については、「集約」をご参照ください。 |
|
token (オプション) |
byte[] |
ページネーショントークン。前の応答の |
クエリ条件
request.searchQuery.query は、次のパラメーターを含む RangeQuery オブジェクトです。
|
名前 |
型 |
説明 |
|
fieldName (必須) |
String |
クエリ対象のインデックスフィールドの名前。範囲クエリは、 |
|
from (オプション) |
ColumnValue |
下限。 |
|
to (オプション) |
ColumnValue |
上限。 |
|
includeLower (オプション) |
boolean |
|
|
includeUpper (オプション) |
boolean |
|
返される列
request.columnsToGet は、次のパラメーターを含む SearchRequest.ColumnsToGet オブジェクトです。
|
名前 |
型 |
説明 |
|
columns (オプション) |
|
返す属性列。このパラメーターは、 |
|
returnAll (オプション) |
boolean |
データテーブルからすべての属性列を返すかどうかを指定します。デフォルト値は |
|
returnAllFromIndex (オプション) |
boolean |
インデックス付けされたすべての属性列を返すかどうかを指定します。デフォルト値は |
戻り値
search は SearchResponse オブジェクトを返します。次の表に、コアフィールドを示します。
|
名前 |
型 |
説明 |
|
totalCount |
long |
一致した行の数。 |
|
rows |
|
このクエリによって返された行。 |
|
searchHits |
|
クエリヒット。 |
|
nextToken |
byte[] |
次のページのトークン。 |
|
isAllSuccess |
boolean |
すべてのインデックスパーティションが正常にクエリされたかどうかを示します。 |
シナリオ例
カスタムフォーマットの日付のクエリ
データテーブルの date_string が String フィールドで、多次元インデックスの Date フィールドに yyyy-MM-dd HH:mm:ss フォーマットでマッピングされている場合、クエリの境界として同じフォーマットの文字列を使用します。次の例では、間隔 [2021-01-01 00:00:00, 2023-01-01 00:00:00) をクエリします。
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("date_string");
rangeQuery.greaterThanOrEqual(ColumnValue.fromString("2021-01-01 00:00:00"));
rangeQuery.lessThan(ColumnValue.fromString("2023-01-01 00:00:00"));
エポック秒タイムスタンプのクエリ
データテーブルの date_epoch が Integer フィールドで、多次元インデックスの Date フィールドに epoch_second フォーマットでマッピングされている場合、クエリの境界としてエポック秒タイムスタンプを使用します。次の例では、1609459200 より大きい値をクエリします。
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("date_epoch");
rangeQuery.greaterThan(ColumnValue.fromLong(1609459200L));