折叠(去重)

更新时间:
复制 MD 格式

使用 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

请求级查询超时时间,单位为毫秒。默认值为 -1,表示不单独设置查询超时时间。

routingValues(可选)

List<PrimaryKey>

自定义路由字段对应的主键值列表。未配置自定义路由时无需设置。

查询配置

request.searchQuery 的类型为 SearchQuery,包含以下参数。

名称

类型

说明

query(必选)

Query

查询条件,支持多元索引的查询类型。

collapse(必选)

Collapse

折叠配置。

offset(可选)

Integer

本次查询的起始分组位置,默认值为 0。与 limit 之和不能超过 100000

limit(可选)

Integer

本次查询返回的最大分组数,默认值为 10。设置为 0 时不返回具体行。仅从多元索引读取返回列时最大值为 1000;任一返回列需要从数据表读取时最大值为 100

highlight(可选)

Highlight

摘要与高亮配置。是否返回高亮结果取决于查询类型和索引字段配置。

sort(可选)

Sort

返回结果的排序方式,决定每个分组返回的代表行以及分组的返回顺序。未设置时使用索引预排序。

trackTotalCount(可选)

int

期望统计的最大匹配行数。默认值为 TRACK_TOTAL_COUNT_DISABLED,表示不统计;设置为 TRACK_TOTAL_COUNT 时统计折叠前的全部匹配行。值越小,查询性能越高。

filter(可选)

SearchFilter

query 的查询结果进行过滤。

aggregationList(可选)

List<Aggregation>

统计聚合配置。统计聚合基于折叠前的匹配结果执行。

groupByList(可选)

List<GroupBy>

分组配置。分组基于折叠前的匹配结果执行。

token(可选)

byte[]

翻页凭证。使用折叠功能时不能设置。

折叠配置

request.searchQuery.collapse 的类型为 Collapse,包含以下参数。

名称

类型

说明

fieldName(必选)

String

折叠字段名称。字段必须启用排序与统计聚合,且必须是 Keyword、Long 或 Double 类型的非数组字段。

返回列

request.columnsToGet 的类型为 SearchRequest.ColumnsToGet,包含以下参数。

名称

类型

说明

columns(可选)

List<String>

要返回的属性列名称。仅 returnAllreturnAllFromIndex 均为 false 时需要设置;未设置时只返回主键列。

returnAll(可选)

boolean

是否返回数据表中的全部属性列。默认值为 false

returnAllFromIndex(可选)

boolean

是否返回多元索引中已存储的全部属性列。默认值为 false。不能与 returnAll 同时设置为 true

返回值

search 方法返回 SearchResponse,与折叠功能相关的核心字段如下。

名称

类型

说明

totalCount

long

折叠前的匹配行数,通过 getTotalCount() 获取。返回值取决于 trackTotalCount 配置,不表示折叠后的分组数。

rows

List<Row>

折叠后的行数据,通过 getRows() 获取,每个不同的折叠字段值最多返回一行。

searchHits

List<SearchHit>

折叠后的查询命中结果,通过 getSearchHits() 获取。

isAllSuccess

boolean

是否已成功查询全部索引分区,通过 isAllSuccess() 获取。值为 false 时返回部分结果。

aggregationResults

AggregationResults

折叠前匹配结果的统计聚合结果,通过 getAggregationResults() 获取。仅配置 aggregationList 时返回。

groupByResults

GroupByResults

折叠前匹配结果的分组结果,通过 getGroupByResults() 获取。仅配置 groupByList 时返回。