Descripción general
regexp_tree permite asignar claves a valores en función de patrones jerárquicos de expresiones regulares.
Está optimizado para lookups por coincidencia de patrones (por ejemplo, clasificar cadenas como user agent strings mediante la coincidencia con patrones regex) en lugar de la coincidencia exacta de claves.
Use el Diccionario de árbol de expresiones regulares con el origen YAMLRegExpTree
YAMLRegExpTree, al que se le indica la ruta a un archivo YAML que contiene el árbol de expresiones regulares.
Query
YAMLRegExpTree representa la estructura de un árbol de expresiones regulares. Por ejemplo:
- regexp: la expresión regular del nodo.
- attributes: una lista de atributos de diccionario definidos por el usuario. En este ejemplo, hay dos atributos:
nameyversion. El primer nodo define ambos atributos. El segundo nodo solo define el atributoname. El atributoversionlo proporcionan los nodos hijos del segundo nodo.- El valor de un atributo puede contener retroreferencias, que remiten a grupos de captura de la expresión regular coincidente. En el ejemplo, el valor del atributo
versionen el primer nodo consta de una retroreferencia\1al grupo de captura(\d+[\.\d]*)en la expresión regular. Los números de retroreferencia van del 1 al 9 y se escriben como$1o\1(para el número 1). La retroreferencia se sustituye por el grupo de captura coincidente durante la ejecución de la consulta.
- El valor de un atributo puede contener retroreferencias, que remiten a grupos de captura de la expresión regular coincidente. En el ejemplo, el valor del atributo
- child nodes: una lista de nodos hijos de un nodo de árbol regexp, cada uno con sus propios atributos y, potencialmente, nodos hijos. La coincidencia de cadenas se realiza recorriendo el árbol en profundidad. Si una cadena coincide con un nodo regexp, el diccionario comprueba si también coincide con los nodos hijos de ese nodo. Si es así, se asignan los atributos del nodo coincidente más profundo. Los atributos de un nodo hijo sobrescriben los atributos con el mismo nombre de los nodos padre. El nombre de los nodos hijos en archivos YAML puede ser arbitrario; por ejemplo,
versionsen el ejemplo anterior.
dictGet, dictGetOrDefault y dictGetAll. Por ejemplo:
Query
Response
\d+/tclwebkit(?:\d+[\.\d]*) en el segundo nodo de la capa superior.
A continuación, el diccionario sigue buscando en los nodos hijo y encuentra que la cadena también coincide con 3[12]/tclwebkit.
Como resultado, el valor del atributo name es Android (definido en la primera capa) y el valor del atributo version es 12 (definido en el nodo hijo).
Con un sofisticado archivo de configuración YAML, puede usar los diccionarios de árbol regexp como analizador de cadenas user agent.
ClickHouse es compatible con uap-core y puede ver cómo usarlo en la prueba funcional 02504_regexp_dictionary_ua_parser
Recopilación de valores de atributos
dictGetAll. Si un nodo tiene un valor de atributo de tipo T, dictGetAll devolverá un Array(T) que contiene cero o más valores.
De forma predeterminada, el número de coincidencias devueltas por clave no tiene límite. Se puede pasar un límite como cuarto argumento opcional a dictGetAll. El array se rellena en orden topológico, lo que significa que los nodos hijo van antes que los nodos padre y que los nodos hermanos siguen el orden del origen.
Ejemplo:
Query
Response
Modos de coincidencia
regexp_dict_flag_case_insensitive: Usa coincidencia sin distinguir entre mayúsculas y minúsculas (el valor predeterminado esfalse). Puede sobrescribirse en expresiones individuales con(?i)y(?-i).regexp_dict_flag_dotall: Permite que ’.’ coincida con caracteres de salto de línea (el valor predeterminado esfalse).
Usar un diccionario de árbol de expresiones regulares en ClickHouse Cloud
YAMLRegExpTree funciona en ClickHouse Open Source, pero no en ClickHouse Cloud.
Para usar diccionarios de árbol de expresiones regulares en ClickHouse Cloud, primero cree localmente en ClickHouse Open Source un diccionario de árbol de expresiones regulares a partir de un archivo YAML y, a continuación, vuelque este diccionario en un archivo CSV mediante la función de tabla dictionary y la cláusula INTO OUTFILE.
id UInt64: el ID del nodo de RegexpTree.parent_id UInt64: el ID del nodo padre.regexp String: la cadena de la expresión regular.keys Array(String): los nombres de los atributos definidos por el usuario.values Array(String): los valores de los atributos definidos por el usuario.
regexp_dictionary_source_table con la siguiente estructura de la tabla: