使用 Tablestore Java SDK 可按指定多元索引字段折叠查询结果,使每个不同字段值只返回一行数据。
前提条件
安装Tablestore Java SDK并初始化客户端。
功能说明
折叠功能按照指定多元索引字段的值对匹配行分组,每个分组只返回一行代表数据。分组内返回哪一行由查询的实际排序方式决定,可通过排序和翻页设置排序方式。折叠只改变查询结果的展示方式,不会修改数据表中的数据。
折叠字段必须在创建多元索引时启用排序与统计聚合,只支持 Keyword、Long 和 Double 类型的非数组字段。
折叠查询只能使用 limit 和 offset 翻页,不能使用 token。
limit + offset不能超过100000。统计聚合和分组基于折叠前的匹配结果执行。返回的总行数也是折叠前的匹配行数,无法获取折叠后的总分组数。
调用 search 方法查询数据,并通过 SearchQuery.collapse 指定折叠字段。
SearchResponse search(SearchRequest request)
以下示例查询全部数据,按照 category 字段折叠结果,并按照 price 字段降序排序,因此每个类别返回价格最高的一行数据。
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(new MatchAllQuery());
searchQuery.setLimit(10);
searchQuery.setCollapse(new Collapse("category"));
searchQuery.setSort(new Sort(
Arrays.asList(new FieldSort("price", SortOrder.DESC))));
SearchRequest.ColumnsToGet columnsToGet =
new SearchRequest.ColumnsToGet();
columnsToGet.setColumns(Arrays.asList("category", "price"));
SearchRequest request =
new SearchRequest("example_table", "example_index", searchQuery);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
System.out.println(response.getRows());
参数说明
查询请求
request 的类型为 SearchRequest,包含以下参数。
|
名称 |
类型 |
说明 |
|
tableName(必选) |
String |
数据表名称。 |
|
indexName(必选) |
String |
多元索引名称。 |
|
searchQuery(必选) |
SearchQuery |
查询条件和折叠配置。 |
|
columnsToGet(可选) |
SearchRequest.ColumnsToGet |
返回列配置。未设置时只返回主键列。 |
|
timeoutInMillisecond(可选) |
int |
请求级查询超时时间,单位为毫秒。默认值为 |
|
routingValues(可选) |
|
自定义路由字段对应的主键值列表。未配置自定义路由时无需设置。 |
查询配置
request.searchQuery 的类型为 SearchQuery,包含以下参数。
|
名称 |
类型 |
说明 |
|
query(必选) |
Query |
查询条件,支持多元索引的查询类型。 |
|
collapse(必选) |
Collapse |
折叠配置。 |
|
offset(可选) |
Integer |
本次查询的起始分组位置,默认值为 |
|
limit(可选) |
Integer |
本次查询返回的最大分组数,默认值为 |
|
highlight(可选) |
Highlight |
摘要与高亮配置。是否返回高亮结果取决于查询类型和索引字段配置。 |
|
sort(可选) |
Sort |
返回结果的排序方式,决定每个分组返回的代表行以及分组的返回顺序。未设置时使用索引预排序。 |
|
trackTotalCount(可选) |
int |
期望统计的最大匹配行数。默认值为 |
|
filter(可选) |
SearchFilter |
对 |
|
aggregationList(可选) |
|
统计聚合配置。统计聚合基于折叠前的匹配结果执行。 |
|
groupByList(可选) |
|
分组配置。分组基于折叠前的匹配结果执行。 |
|
token(可选) |
byte[] |
翻页凭证。使用折叠功能时不能设置。 |
折叠配置
request.searchQuery.collapse 的类型为 Collapse,包含以下参数。
|
名称 |
类型 |
说明 |
|
fieldName(必选) |
String |
折叠字段名称。字段必须启用排序与统计聚合,且必须是 Keyword、Long 或 Double 类型的非数组字段。 |
返回列
request.columnsToGet 的类型为 SearchRequest.ColumnsToGet,包含以下参数。
|
名称 |
类型 |
说明 |
|
columns(可选) |
|
要返回的属性列名称。仅 |
|
returnAll(可选) |
boolean |
是否返回数据表中的全部属性列。默认值为 |
|
returnAllFromIndex(可选) |
boolean |
是否返回多元索引中已存储的全部属性列。默认值为 |
返回值
search 方法返回 SearchResponse,与折叠功能相关的核心字段如下。
|
名称 |
类型 |
说明 |
|
totalCount |
long |
折叠前的匹配行数,通过 |
|
rows |
|
折叠后的行数据,通过 |
|
searchHits |
|
折叠后的查询命中结果,通过 |
|
isAllSuccess |
boolean |
是否已成功查询全部索引分区,通过 |
|
aggregationResults |
AggregationResults |
折叠前匹配结果的统计聚合结果,通过 |
|
groupByResults |
GroupByResults |
折叠前匹配结果的分组结果,通过 |