过滤器

更新时间:
复制 MD 格式

Go SDK 可在读取宽表模型数据时使用服务端过滤器筛选行或截取返回的属性列。

前提条件

安装Tablestore Go SDK并初始化客户端。

功能说明

过滤器在服务端对读取结果进行二次筛选,不减少读取消耗的 CU。GetRowGetRangeBatchGetRow 的查询条件均可设置过滤器。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(必选)

*string

要判断的属性列名称。

Comparator(必选)

*ComparatorType

关系运算符。支持 CT_EQUALCT_NOT_EQUALCT_GREATER_THANCT_GREATER_EQUALCT_LESS_THANCT_LESS_EQUAL

ColumnValue(必选)

interface{}

用于比较的值。

FilterIfMissing(可选)

bool

行不包含判断列时是否过滤该行。默认值为 false,即返回该行。

LatestVersionOnly(可选)

bool

是否只判断最新版本。默认值为 false,即任意版本满足条件时返回该行。

单属性列正则过滤器

调用 NewSingleColumnValueRegexFilter(columnName, comparator, rule, value) 创建正则过滤器。只有 STRING 属性列支持正则过滤。

除单属性列值过滤器的参数外,还需设置 ValueTransferRule

名称

类型

说明

Regex(必选)

string

用于提取子字符串的正则表达式,长度不超过 256 字节。

  • 支持 Perl 兼容正则表达式(PCRE)和单字节正则表达式。

  • 正则表达式不支持包含中文字符。

  • 支持分组语法。正则表达式包含分组时,使用第一个分组匹配的子字符串。例如,属性列值为 1aaa51bbb5、正则表达式为 1([a-z]+)5 时,提取结果为 aaa

Cast_type(必选)

VariantType

提取结果的转换类型。支持 Variant_INTEGERVariant_DOUBLEVariant_STRING

组合过滤器

调用 NewCompositeColumnCondition(lo) 创建组合过滤器,并调用 AddFilter 添加子过滤器。

名称

类型

说明

Operator(必选)

LogicalOperator

逻辑运算符。支持 LO_NOTLO_ANDLO_OR

Filters(必选)

[]ColumnFilter

参与逻辑运算的子过滤器,支持以下类型:

  • 单属性列值过滤器,通过 NewSingleColumnCondition 创建。

  • 单属性列正则过滤器,通过 NewSingleColumnValueRegexFilter 创建。

  • 组合过滤器,通过 NewCompositeColumnCondition 创建,可继续嵌套子过滤器。

列分页过滤器

PaginationFilter 包含以下参数。

名称

类型

说明

Limit(必选)

int32

返回的属性列数量,必须大于 0。

Offset(可选)

int32

跳过的属性列数量,必须大于或等于 0,默认值为 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 >= 60status 等于 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,
}