Go SDK 可在读取宽表模型数据时使用服务端过滤器筛选行或截取返回的属性列。
前提条件
安装Tablestore Go SDK并初始化客户端。
功能说明
过滤器在服务端对读取结果进行二次筛选,不减少读取消耗的 CU。GetRow、GetRange 和 BatchGetRow 的查询条件均可设置过滤器。Go SDK 支持以下类型:
-
单属性列值过滤器(
SingleColumnCondition):判断单个属性列值是否符合条件。 -
单属性列正则过滤器(
SingleColumnValueRegexFilter):从 STRING 属性列中提取子字符串、转换类型后再比较。 -
组合过滤器(
CompositeColumnCondition):通过 AND、OR 或 NOT 组合多个过滤器,最多包含 32 个条件。 -
列分页过滤器(
PaginationFilter):按偏移量和数量截取返回的属性列,不判断列值。
以下示例使用单属性列值过滤器,仅返回 score >= 60 的行。
filter := tablestore.NewSingleColumnCondition(
"score",
tablestore.CT_GREATER_EQUAL,
int64(60),
)
request.RangeRowQueryCriteria.Filter = filter
response, err := client.GetRange(request)
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Rows)
参数说明
单属性列值过滤器
调用 NewSingleColumnCondition(columnName, comparator, value) 创建单属性列值过滤器。SingleColumnCondition 包含以下参数。
|
名称 |
类型 |
说明 |
|
ColumnName(必选) |
|
要判断的属性列名称。 |
|
Comparator(必选) |
|
关系运算符。支持 |
|
ColumnValue(必选) |
|
用于比较的值。 |
|
FilterIfMissing(可选) |
|
行不包含判断列时是否过滤该行。默认值为 |
|
LatestVersionOnly(可选) |
|
是否只判断最新版本。默认值为 |
单属性列正则过滤器
调用 NewSingleColumnValueRegexFilter(columnName, comparator, rule, value) 创建正则过滤器。只有 STRING 属性列支持正则过滤。
除单属性列值过滤器的参数外,还需设置 ValueTransferRule。
|
名称 |
类型 |
说明 |
|
Regex(必选) |
|
用于提取子字符串的正则表达式,长度不超过 256 字节。
|
|
Cast_type(必选) |
|
提取结果的转换类型。支持 |
组合过滤器
调用 NewCompositeColumnCondition(lo) 创建组合过滤器,并调用 AddFilter 添加子过滤器。
|
名称 |
类型 |
说明 |
|
Operator(必选) |
|
逻辑运算符。支持 |
|
Filters(必选) |
|
参与逻辑运算的子过滤器,支持以下类型:
|
列分页过滤器
PaginationFilter 包含以下参数。
|
名称 |
类型 |
说明 |
|
Limit(必选) |
|
返回的属性列数量,必须大于 0。 |
|
Offset(可选) |
|
跳过的属性列数量,必须大于或等于 0,默认值为 |
场景示例
正则过滤
以下示例从 profile 列的 level:active 格式值中提取 active,并判断是否等于指定值。
rule := tablestore.NewValueTransferRule(
`level:([a-z]+)`,
tablestore.Variant_STRING,
)
filter := tablestore.NewSingleColumnValueRegexFilter(
"profile",
tablestore.CT_EQUAL,
rule,
"active",
)
request.SingleRowQueryCriteria.Filter = filter
组合过滤
以下示例筛选 score >= 60 且 status 等于 active 的行。
filter := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
filter.AddFilter(
tablestore.NewSingleColumnCondition("score", tablestore.CT_GREATER_EQUAL, int64(60)),
)
filter.AddFilter(
tablestore.NewSingleColumnCondition("status", tablestore.CT_EQUAL, "active"),
)
request.RangeRowQueryCriteria.Filter = filter
分页返回属性列
以下示例跳过第一个属性列并返回其后的两个属性列。
request.SingleRowQueryCriteria.Filter = &tablestore.PaginationFilter{
Offset: 1,
Limit: 2,
}