Visão geral
regexp_tree permite mapear chaves para valores com base em padrões hierárquicos de expressões regulares.
Ele é otimizado para buscas por correspondência de padrões (por exemplo, classificar strings, como strings de user agent, por meio da correspondência com padrões regex) em vez de correspondência exata de chaves.
Use o dicionário de árvore regexp com a fonte YAMLRegExpTree
YAMLRegExpTree, à qual é fornecido o caminho para um arquivo YAML que contém a árvore regexp.
Query
YAMLRegExpTree representa a estrutura de uma árvore regexp. Por exemplo:
- regexp: a expressão regular do nó.
- attributes: uma lista de atributos de dicionário definidos pelo usuário. Neste exemplo, há dois atributos:
nameeversion. O primeiro nó define os dois atributos. O segundo nó define apenas o atributoname. O atributoversioné fornecido pelos nós filhos do segundo nó.- O valor de um atributo pode conter retroreferências, que se referem a grupos de captura da expressão regular correspondente. No exemplo, o valor do atributo
versionno primeiro nó consiste em uma retroreferência\1ao grupo de captura(\d+[\.\d]*)na expressão regular. Os números de retroreferência variam de 1 a 9 e são escritos como$1ou\1(para o número 1). A retroreferência é substituída pelo grupo de captura correspondente durante a execução da consulta.
- O valor de um atributo pode conter retroreferências, que se referem a grupos de captura da expressão regular correspondente. No exemplo, o valor do atributo
- child nodes: uma lista de filhos de um nó de árvore regexp, cada um com seus próprios atributos e (potencialmente) nós filhos. A correspondência de strings segue uma busca em profundidade. Se uma string corresponder a um nó regexp, o dicionário verifica se ela também corresponde aos nós filhos desse nó. Se isso acontecer, os atributos do nó correspondente mais profundo serão atribuídos. Os atributos de um nó filho substituem os atributos com o mesmo nome dos nós pai. O nome dos nós filhos em arquivos YAML pode ser arbitrário, por exemplo,
versionsno exemplo acima.
dictGet, dictGetOrDefault e dictGetAll. Por exemplo:
Query
Response
\d+/tclwebkit(?:\d+[\.\d]*) no segundo nó da camada superior.
Em seguida, o dicionário continua a procurar nos nós filhos e descobre que a string também corresponde a 3[12]/tclwebkit.
Como resultado, o valor do atributo name é Android (definido na primeira camada) e o valor do atributo version é 12 (definido no nó filho).
Com um arquivo de configuração YAML sofisticado, você pode usar dicionários de árvore regexp como analisador de strings de user agent.
O ClickHouse oferece suporte a uap-core e você pode ver como usá-lo no teste funcional 02504_regexp_dictionary_ua_parser
Coletando valores de atributo
dictGetAll pode ser usada. Se um nó tiver um valor de atributo do tipo T, dictGetAll retornará um Array(T) contendo zero ou mais valores.
Por padrão, o número de correspondências retornadas por chave é ilimitado. Um limite pode ser passado como quarto argumento opcional para dictGetAll. O array é preenchido em ordem topológica, o que significa que os nós filhos vêm antes dos nós pais, e os nós irmãos seguem a ordem da fonte.
Exemplo:
Query
Response
Modos de correspondência
regexp_dict_flag_case_insensitive: Usa correspondência sem diferenciar maiúsculas de minúsculas (o padrão éfalse). Pode ser sobrescrita em expressões individuais com(?i)e(?-i).regexp_dict_flag_dotall: Permite que ’.’ corresponda a caracteres de nova linha (o padrão éfalse).
Usar dicionário de árvore regexp no ClickHouse Cloud
YAMLRegExpTree funciona no ClickHouse Open Source, mas não no ClickHouse Cloud.
Para usar dicionários de árvore regexp no ClickHouse Cloud, primeiro crie localmente, no ClickHouse Open Source, um dicionário de árvore regexp a partir de um arquivo YAML e, em seguida, exporte esse dicionário para um arquivo CSV usando a função de tabela dictionary e a cláusula INTO OUTFILE.
id UInt64: o ID do nó RegexpTree.parent_id UInt64: o ID do nó pai.regexp String: a expressão regular.keys Array(String): os nomes dos atributos definidos pelo usuário.values Array(String): os valores dos atributos definidos pelo usuário.
regexp_dictionary_source_table com a estrutura abaixo: