JSON查询

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());
}