全部產品
Search
文件中心

Tablestore:JSON查詢

更新時間:Dec 06, 2025

JSON包括Object類型和Nested類型,查詢 JSON Object類型時直接使用所需查詢類型進行操作即可,查詢JSON Nested類型時必須使用NestedQuery封裝查詢條件。

前提條件

使用限制

向量類型欄位無法在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());
}