Looker 过滤(looker-filters)是一份关于 Looker 过滤机制的技术指南,主要解决“在什么场景下应该使用哪种过滤方式”以及“各种过滤表达式应如何编写”两类问题。资料按用途组织内容,覆盖单字段过滤表达式、跨字段自定义过滤器、LookML 过滤块以及 SDK 查询过滤等层面。
一、过滤机制选型 资料给出了按过滤需求选择机制的指引:单字段的精确匹配、列表(OR)、范围、通配符、空值检查以及相对或绝对日期,使用 Looker Filter Expression,即以带引号的简写字符串表示每个字段的过滤条件,多个字段之间以 AND 组合;这类表达式可出现在 measure 的 filters、Explore 查询的 filters、always_filter、aggregate_table、NDT 与 .test.lkml 的 explore_source、.dashboard.lookml 以及 run_inline_query 或 create_query 的 body["filters"] 中。 需要在查询或 NDT 阶段进行跨字段比较(如 ${orders.created_year} = ${users.created_year})或跨列 OR 时,应使用 Custom Filter,其写法为只引用维度的布尔 Looker 表达式,可用于 run_inline_query 或 create_query 的 body["filter_expression"]、Explore 的 Custom Filter 界面,或 NDT 的 explore_source expression_custom_filter。 若需要在 LookML measure 内部复用跨列 OR,资料建议使用隐藏的 type: yesno 辅助维度,再在 filters 中引用。 按用户属性强制实施行级安全时使用 access_filter,其中 access_grant 只接受字面允许值,不接受过滤表达式。 将 Explore 运行时过滤下推到内层派生表时,可使用 bind_all_filters、bind_filters 或 Gold 层的 Liquid {% condition %}。
二、按数据类型的过滤表达式语法 资料说明,在 LookML 的 filters 中,整个过滤表达式需要放在双引号内,尤其是 "NULL"、"-NULL" 和 "NOT NULL";而在 Explore UI 的 matches (advanced) 以及 SDK body["filters"] 的值中,不需要外层的 LookML 引号。 字符串:支持精确匹配、逗号分隔的 OR、% 与 _ 通配、前导 - 取反、组合正负条件,以及 "NULL"、"-NULL"、"EMPTY"、"-EMPTY" 等特殊写法;同时提醒在 string 维度上写 "NOT NULL" 会匹配字面字符串,应使用 "-NULL"。特殊字符(引号、%、_、逗号、^)需用 ^ 转义,前导 - 或前导空格在首字符位置也需转义。 日期与时间:覆盖 today、yesterday、tomorrow、this/last 加时间粒度、滚动窗口、带 ago for 的完整历史区间、this {interval} to {interval}(YTD/WTD)、after/before 的开闭界语义、{time} to {time} 的半开区间、{time} for {n} {interval}、年/月/日/季度写法(要求补零)、财年周期、未来窗口以及星期几。日期条件可在同一过滤中用逗号表示 OR;无法写成区间的 AND 边界,可过滤同一 dimension_group 的两个时间粒度。对时间戳/日期做空值检查时,建议在原始时间粒度上定义一个正向的 yesno 维度,再用它过滤。 数字:支持等于、IN、关系比较、闭区间、代数区间记号、开区间与并集区间、NULL 与 NOT NULL;并提示数字上“前导 NOT”的陷阱——首项带 NOT 会令后续各项一并取反。 布尔:type: yesno 字段使用 "yes"/"no",原始布尔列使用 "TRUE"/"FALSE"。 地理位置与用户属性:位置支持精确坐标、距离(单位需用复数)、方框范围与空值检查;过滤字符串中可嵌入用户属性占位符。
三、Custom Filter 规则 Custom Filter 使用 looker-expressions 语法,必须求值为 yes 或 no,会编译成仓库 SQL 的 WHERE 条件,且只能引用维度,不能引用度量、总计、位置/透视函数或表计算。单字段简写可通过 matches_filter 桥接,在 Custom Filter 内用反引号传入过滤表达式。Custom Filter 的编写位置包括:SDK 查询体的 filter_expression、LookML NDT 的 expression_custom_filter,以及 dynamic_fields 中 Custom Measure 的 filter_expression。
四、在 LookML 与 SDK 中的使用 LookML 方面:measure 的 filters 仅适用于聚合型度量(count、count_distinct、sum、average),不能放在 type: number 上;应过滤底层 sum/count 组件度量。多个 filters 条目以 AND 组合;跨列 OR 需借助隐藏的 yesno 维度。Explore 的 Quick Start query 可在维度和度量上设置 filters;always_filter 可强制可编辑的默认过滤;NDT 的 explore_source 支持 filters、dev_filters、bind_all_filters、bind_filters 和 expression_custom_filter;数据测试可用 filters 把断言绑定到确定的历史切片。 SDK 方面:通过 run_inline_query、create_query(配合 run_query)或 create_query_task 执行或保存查询时,查询体中的四个键控制过滤——"filters"(映射,AND 组合)、"filter_expression"(布尔 Looker 表达式,适用于跨字段 OR 或字段比较,与 filters 以 AND 组合)、"filter_config"(Explore UI 过滤栏状态,创建或修改查询时应省略或设为 None,非空值会覆盖 filters)、"dynamic_fields"(JSON 数组,其中的 Custom Measure 可接受 filter_expression 或 filters)。资料还给出了一段基于 SDK 的查询体示例,包含 filters、filter_expression、filter_config 为 None、排序与 limit 等字段。 仪表板过滤:可使用 create_dashboard_filter、update_dashboard_filter 创建和更新(default_value 接受过滤表达式字符串),并通过 create_dashboard_element、update_dashboard_element 的 listen 或 .dashboard.lookml 中的 filters 加 listen 将过滤条件与图块关联起来。
文末还列出了公开参考资料,包括 Looker 过滤表达式、创建 Looker 表达式(Custom filters)、measure 的 filters 参数、explore_source 以及 matches_filter 函数。