Tablestore SDK for Java を使用して、多次元インデックス内の Object 型または Nested 型の JSON フィールドのサブフィールドをクエリできます。 Object フィールドは子オブジェクトの境界を保持しませんが、Nested フィールドは保持します。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
ターゲットフィールドは、検索インデックスで JSON フィールドとして設定され、
jsonTypeはOBJECTまたはNESTEDに設定されます。詳細については、「検索インデックスを作成する」をご参照ください。
機能説明
JSON クエリは専用のクエリタイプを使用しません。多次元インデックス内の JSON フィールドの jsonType に基づいてクエリメソッドを選択します。
|
JSON タイプ |
フィールド間の関係 |
クエリメソッド |
|
Object |
配列内のオブジェクトの境界を保持しません。 異なるクエリ条件を、異なるオブジェクトで満たすことができます。 |
サブフィールドの型と一致要件に適したクエリタイプを直接使用します。 各サブフィールド名には完全なパスを指定します。 |
|
Nested |
配列内の各オブジェクトを独立した子行として格納し、同じオブジェクト内のフィールド間の関係を保持します。 |
サブクエリを |
たとえば、テーブルの address 列が String 型で、次の JSON 配列を格納していると仮定します。
[
{ "country": "China", "city": "hangzhou" },
{ "country": "usa", "city": "Seattle" }
]
country="China" と city="Seattle" の両方をクエリする場合、address がオブジェクト フィールドとして設定されていると、異なるオブジェクトが 2 つの条件を満たすことができるため、行が返されます。address がネストされた フィールドとして設定されている場合は、単一のオブジェクトで両方の条件を満たすことができないため、行は返されません。
search を呼び出して JSON クエリを実行します。
SearchResponse search(SearchRequest request)
JSON フィールドの subFieldSchemas には、ベクターフィールドを含めることはできません。
Object フィールドのクエリ
次の例では、address.country が China で、address.city が Seattle である行をクエリします。address はオブジェクトフィールドであるため、異なるオブジェクトが 2 つの条件を満たすことができます。
String tableName = "example_table";
String indexName = "example_index";
TermQuery countryQuery = new TermQuery();
countryQuery.setFieldName("address.country");
countryQuery.setTerm(ColumnValue.fromString("China"));
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("address.city");
cityQuery.setTerm(ColumnValue.fromString("Seattle"));
BoolQuery objectQuery = new BoolQuery();
objectQuery.setMustQueries(Arrays.asList(countryQuery, cityQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(objectQuery);
searchQuery.setLimit(10);
SearchRequest request =
new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
System.out.println(response.getRows());
Nested フィールドのクエリ
次の例では、address 内の同じオブジェクトの address.country の値が China で、かつ address.city の値が Seattle である行をクエリします。 ネストされたフィールドのクエリメソッドとパラメーターの詳細については、「ネストされたクエリ」をご参照ください。
String tableName = "example_table";
String indexName = "example_index";
TermQuery countryQuery = new TermQuery();
countryQuery.setFieldName("address.country");
countryQuery.setTerm(ColumnValue.fromString("China"));
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("address.city");
cityQuery.setTerm(ColumnValue.fromString("Seattle"));
BoolQuery childQuery = new BoolQuery();
childQuery.setMustQueries(Arrays.asList(countryQuery, cityQuery));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("address");
nestedQuery.setQuery(childQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
searchQuery.setLimit(10);
SearchRequest request =
new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
System.out.println(response.getRows());
パラメーター
検索リクエスト
リクエスト は SearchRequest 型で、次のパラメーターが含まれています。
|
名前 |
型 |
説明 |
|
tableName (必須) |
String |
テーブルの名前。 |
|
indexName (必須) |
String |
検索インデックスの名前。 |
|
searchQuery (必須) |
SearchQuery |
クエリ条件と共通のクエリ構成。 |
|
columnsToGet (オプション) |
SearchRequest.ColumnsToGet |
返却する列の構成。 このパラメーターを構成しない場合、プライマリキー列のみが返されます。 |
|
timeoutInMillisecond (オプション) |
int |
リクエストレベルのクエリタイムアウト期間 (ミリ秒) です。デフォルト値は |
|
routingValues (オプション) |
|
カスタムルートフィールドに対応するプライマリキー値。 カスタムルーティングを使用しない場合は、このパラメーターを構成する必要はありません。 |
クエリ構成
request.searchQuery は SearchQuery 型であり、以下のパラメーターが含まれています。
|
名前 |
型 |
説明 |
|
query (必須) |
Query |
クエリ条件。 Object フィールドの場合、サブフィールドタイプと一致要件に適したクエリタイプを直接設定します。 Nested フィールドの場合、このパラメーターを |
|
offset (オプション) |
Integer |
現在のクエリが開始される位置。 |
|
limit (オプション) |
Integer |
返す行の最大数です。このパラメーターを |
|
highlight (オプション) |
Highlight |
まとめとハイライトの構成。Nested フィールドの場合、 |
|
collapse (オプション) |
Collapse |
指定されたフィールドに基づいて重複した結果を削除する、結果の折りたたみ構成。 |
|
sort (オプション) |
Sort |
結果のソートメソッド。 |
|
trackTotalCount (オプション) |
int |
カウントする一致した行の最大数です。デフォルト値は |
|
filter (オプション) |
SearchFilter |
|
|
aggregationList (オプション) |
|
集約構成。 |
|
groupByList (オプション) |
|
グループ化構成。 |
|
token (オプション) |
byte[] |
ページネーショントークンです。データの読み取りを続行するには、このパラメーターに前の応答に含まれる |
Nested クエリ条件
ネストされたフィールドをクエリすると、request.searchQuery.query は NestedQuery タイプになり、次のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
path (必須) |
String |
クエリする Nested フィールドのパス。 マルチレベルの Nested フィールドをクエリするには、対象フィールドの完全なパスを指定します。 |
|
query (必須) |
Query |
|
|
scoreMode (必須) |
ScoreMode |
複数の子行が一致した場合に、親行のスコアを計算するために使用されるメソッドです。 |
|
innerHits (オプション) |
InnerHits |
一致する子行の返却、ソート、ページネーション、ハイライトに使用される構成。 このパラメーターを構成しない場合、一致する子行の詳細は返されません。 |
|
weight (オプション) |
float |
クエリの重み。デフォルト値は |
子行の返却構成
request.searchQuery.query.innerHits は InnerHits 型で、以下のパラメーターを含みます。
|
名前 |
型 |
説明 |
|
sort (オプション) |
Sort |
一致する子行のソート方法です。 |
|
offset (オプション) |
Integer |
一致する子行が返される開始位置。 |
|
limit (オプション) |
Integer |
返される一致する子行の最大数です。デフォルト値は |
|
highlight (オプション) |
Highlight |
一致する子行のまとめとハイライトの構成。 |
返却される列
request.columnsToGet は SearchRequest.ColumnsToGet 型で、以下のパラメーターが含まれます。
|
名前 |
型 |
説明 |
|
columns (オプション) |
|
返される属性列の名前。このパラメーターは、 |
|
returnAll (オプション) |
boolean |
テーブル内のすべての属性列を返すかどうかを指定します。デフォルト値は |
|
returnAllFromIndex (オプション) |
boolean |
インデックスが作成されたすべての属性列を返すかどうかを指定します。デフォルト値は |
応答
search メソッドは SearchResponse オブジェクトを返します。 次の表では、主なフィールドについて説明します。
|
名前 |
型 |
説明 |
|
totalCount |
long |
一致した行数です。 |
|
rows |
|
現在のクエリによって返される行です。 |
|
searchHits |
|
クエリヒットです。 |
|
nextToken |
byte[] |
次のページのトークンです。 |
|
isAllSuccess |
boolean |
すべてのインデックスパーティションがクエリされたかどうかを示します。 |