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());
}该文章对您有帮助吗?