Vue d’ensemble
regexp_tree vous permet d’associer des clés à des valeurs à partir de motifs hiérarchiques d’expressions régulières.
Il est optimisé pour les recherches par correspondance de motifs (par exemple, pour classer des chaînes telles que des chaînes user agent en faisant correspondre des motifs regex) plutôt que pour la correspondance exacte des clés.
Utiliser le dictionnaire en arbre d’expressions régulières avec la source YAMLRegExpTree
YAMLRegExpTree, à laquelle on fournit le chemin d’accès vers un fichier YAML contenant l’arborescence d’expressions régulières.
Query
YAMLRegExpTree représente la structure d’un arbre regexp. Par exemple :
- regexp : l’expression régulière du nœud.
- attributes : une liste d’attributs de dictionnaire définis par l’utilisateur. Dans cet exemple, il y a deux attributs :
nameetversion. Le premier nœud définit les deux attributs. Le second nœud ne définit que l’attributname. L’attributversionest fourni par les nœuds enfants du second nœud.- La valeur d’un attribut peut contenir des références arrière, qui renvoient à des groupes de capture de l’expression régulière correspondante. Dans l’exemple, la valeur de l’attribut
versiondans le premier nœud se compose d’une référence arrière\1vers le groupe de capture(\d+[\.\d]*)de l’expression régulière. Les numéros de référence arrière vont de 1 à 9 et s’écrivent$1ou\1(pour le numéro 1). La référence arrière est remplacée par le groupe de capture correspondant lors de l’exécution de la requête.
- La valeur d’un attribut peut contenir des références arrière, qui renvoient à des groupes de capture de l’expression régulière correspondante. Dans l’exemple, la valeur de l’attribut
- child nodes : une liste de nœuds enfants d’un nœud d’arbre regexp, chacun ayant ses propres attributs et, éventuellement, ses propres nœuds enfants. La recherche de correspondance dans les chaînes se fait en parcours en profondeur. Si une chaîne correspond à un nœud regexp, le dictionnaire vérifie si elle correspond aussi aux nœuds enfants de ce nœud. Si c’est le cas, les attributs du nœud correspondant le plus profond sont attribués. Les attributs d’un nœud enfant remplacent les attributs de même nom des nœuds parents. Dans les fichiers YAML, le nom des nœuds enfants peut être arbitraire, par exemple
versionsdans l’exemple ci-dessus.
dictGet, dictGetOrDefault et dictGetAll. Par exemple :
Query
Response
\d+/tclwebkit(?:\d+[\.\d]*) dans le deuxième nœud de la couche supérieure.
Le dictionnaire poursuit ensuite la recherche dans les nœuds enfants et constate que la chaîne correspond également à 3[12]/tclwebkit.
Par conséquent, la valeur de l’attribut name est Android (définie dans la première couche) et la valeur de l’attribut version est 12 (définie dans le nœud enfant).
À l’aide d’un fichier de configuration YAML sophistiqué, vous pouvez utiliser des dictionnaires regexp en arborescence comme parseur de chaînes user agent.
ClickHouse prend en charge uap-core et vous pouvez voir comment l’utiliser dans le test fonctionnel 02504_regexp_dictionary_ua_parser
Récupération des valeurs d’attribut
dictGetAll peut être utilisée. Si un nœud possède une valeur d’attribut de type T, dictGetAll retourne un Array(T) contenant zéro, une ou plusieurs valeurs.
Par défaut, le nombre de correspondances renvoyées par clé n’est pas limité. Une limite peut être passée en quatrième argument facultatif à dictGetAll. Le tableau est rempli dans un ordre topologique, ce qui signifie que les nœuds enfants précèdent les nœuds parents et que les nœuds frères suivent l’ordre dans la source.
Exemple :
Query
Response
Modes de correspondance
regexp_dict_flag_case_insensitive: utilise une correspondance insensible à la casse (par défautfalse). Peut être redéfini dans des expressions individuelles avec(?i)et(?-i).regexp_dict_flag_dotall: autorise.à correspondre aux caractères de saut de ligne (par défautfalse).
Utiliser un dictionnaire en arbre d’expressions régulières dans ClickHouse Cloud
YAMLRegExpTree fonctionne dans ClickHouse Open Source, mais pas dans ClickHouse Cloud.
Pour utiliser des dictionnaires en arbre d’expressions régulières dans ClickHouse Cloud, créez d’abord localement, dans ClickHouse Open Source, un dictionnaire en arbre d’expressions régulières à partir d’un fichier YAML, puis exportez ce dictionnaire vers un fichier CSV à l’aide de la fonction de table dictionary et de la clause INTO OUTFILE.
id UInt64: l’identifiant du nœud RegexpTree.parent_id UInt64: l’identifiant du parent d’un nœud.regexp String: la chaîne d’expression régulière.keys Array(String): les noms des attributs définis par l’utilisateur.values Array(String): les valeurs des attributs définis par l’utilisateur.
regexp_dictionary_source_table avec la structure de table suivante :