JSON包括Object類型和Nested類型,查詢 JSON Object類型時直接使用所需查詢類型進行操作即可,查詢JSON Nested類型時必須使用NestedQuery封裝查詢條件。
前提條件
已在資料表上建立多元索引並配置JSON欄位的類型。
使用限制
向量類型欄位無法在JSON中使用。
查詢情境
假設資料表中有id(String類型)和address(String類型)列,其中address列用於儲存JSON格式的資料。
假設某行address列值為[{ "country": "China", "city": "hangzhou" }, { "country": "usa", "city": "Seattle" }]。當查詢條件為country="China"且city="Seattle"時,如果address列設定為Nested類型,則無法查到該行資料;如果address列設定為Object類型,則可以查詢到該行資料。
範例程式碼
JSON Nested類型查詢樣本
以下樣本用於查詢address的同一子行能滿足address.country為"China"且address.city為"Seattle"兩個條件的行資料。
public static void nestedQuery(SyncClient client) {
// 查詢條件一:要求address子行的country列值為"China"
TermQuery termQuery1 = new TermQuery();
termQuery1.setFieldName("address.country");
termQuery1.setTerm(ColumnValue.fromString("China"));
// 查詢條件二:要求address子行的city列值為"Seattle"
TermQuery termQuery2 = new TermQuery();
termQuery2.setFieldName("address.city");
termQuery2.setTerm(ColumnValue.fromString("Seattle"));
// 通過BoolQuery的And條件,查詢同時滿足上述條件的子行
List<Query> mustQueries = new ArrayList<>();
mustQueries.add(termQuery1);
mustQueries.add(termQuery2);
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(mustQueries);
// NestedQuery內部設定BoolQuery,要求某一子行同時滿足多個查詢條件
NestedQuery nestedQuery = new NestedQuery(); //設定查詢類型為NestedQuery。
nestedQuery.setPath("address"); //設定巢狀型別列的路徑,即要查詢欄位的父路徑。
nestedQuery.setQuery(boolQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
SearchResponse resp = client.search(searchRequest);
System.out.println("Row: " + resp.getRows());
}JSON Object類型查詢樣本
以下樣本用於查詢address列的多個子行滿足address.country為"China"且address.city為"Seattle"兩個條件的行資料。
public static void boolQuery(SyncClient client) {
// 查詢條件一:要求address子行的country列值為"China"
TermQuery termQuery1 = new TermQuery();
termQuery1.setFieldName("address.country");
termQuery1.setTerm(ColumnValue.fromString("China"));
// 查詢條件二:要求address子行的city列值為"Seattle"
TermQuery termQuery2 = new TermQuery();
termQuery2.setFieldName("address.city");
termQuery2.setTerm(ColumnValue.fromString("Seattle"));
// 通過BoolQuery的And條件,查詢同時滿足上述條件的子行
List<Query> mustQueries = new ArrayList<>();
mustQueries.add(termQuery1);
mustQueries.add(termQuery2);
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(mustQueries);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
SearchResponse resp = client.search(searchRequest);
System.out.println("Row: " + resp.getRows());
}