概述
regexp_tree 字典允许你根据分层正则表达式模式将键映射到值。
它针对模式匹配查找进行了优化 (例如,通过匹配正则表达式模式对 User-Agent 字符串这类字符串进行分类) ,而不是精确的键名匹配。
使用 YAMLRegExpTree 源的正则表达式树字典
YAMLRegExpTree 源定义,该源需要提供一个指向包含正则表达式树的 YAML 文件的路径。
Query
YAMLRegExpTree 字典源表示 正则表达式树 的结构。例如:
- regexp:节点的正则表达式。
- 属性:用户定义的字典属性列表。在此示例中,有两个属性:
name和version。第一个节点定义了这两个属性。第二个节点只定义了属性name。属性version由第二个节点的子节点提供。- 属性值可以包含反向引用,用于引用匹配到的正则表达式捕获组。在此示例中,第一个节点中属性
version的值包含一个反向引用\1,它指向正则表达式中的捕获组(\d+[\.\d]*)。反向引用编号范围为 1 到 9,写作$1或\1(以数字 1 为例) 。执行查询时,反向引用会被替换为匹配到的捕获组。
- 属性值可以包含反向引用,用于引用匹配到的正则表达式捕获组。在此示例中,第一个节点中属性
- 子节点:正则表达式树 节点的子节点列表,每个子节点都有自己的属性以及 (可能存在的) 子节点。字符串匹配按深度优先的方式进行。如果某个字符串匹配一个 regexp 节点,字典会检查它是否也匹配该节点的子节点。如果是,则会赋予最深层匹配节点的属性。子节点的属性会覆盖父节点中同名的属性。YAML 文件中的子节点名称可以是任意的,例如上例中的
versions。
dictGet、dictGetOrDefault 和 dictGetAll 访问。例如:
Query
Response
\d+/tclwebkit(?:\d+[\.\d]*)。
然后,字典会继续查找子节点,并发现该字符串也匹配 3[12]/tclwebkit。
因此,属性 name 的值为 Android (定义于第一层) ,而属性 version 的值为 12 (定义于子节点) 。
借助复杂的 YAML 配置文件,你可以将 正则表达式树 dictionaries 用作 User-Agent 字符串解析器。
ClickHouse 支持 uap-core,你可以在功能测试 02504_regexp_dictionary_ua_parser 中查看其用法
收集属性值
dictGetAll 函数。如果某个节点的属性值类型为 T,dictGetAll 将返回一个 Array(T),其中包含零个或多个值。
默认情况下,每个键返回的匹配数量不受限制。也可以将上限作为可选的第四个参数传给 dictGetAll。该数组会按拓扑顺序填充,也就是说,子节点排在父节点之前,而同级节点则遵循源中的顺序。
示例:
Query
Response
匹配模式
regexp_dict_flag_case_insensitive:使用不区分大小写的匹配 (默认为false) 。也可在单个表达式中使用(?i)和(?-i)进行覆盖。regexp_dict_flag_dotall:允许.匹配换行字符 (默认为false) 。
在 ClickHouse Cloud 中使用正则表达式树字典
YAMLRegExpTree 源可在 ClickHouse Open Source 中使用,但在 ClickHouse Cloud 中不受支持。
要在 ClickHouse Cloud 中使用正则表达式树字典,首先在本地的 ClickHouse Open Source 中基于 YAML 文件创建一个正则表达式树字典,然后使用 dictionary 表函数和 INTO OUTFILE 子句将该字典转储到 CSV file 中。
id UInt64:RegexpTree 节点的 id。parent_id UInt64:节点父节点的 id。regexp String:正则表达式字符串。keys Array(String):用户定义属性的名称。values Array(String):用户定义属性的值。
regexp_dictionary_source_table 的表,其表结构如下: