Обзор
regexp_tree позволяет сопоставлять ключи со значениями на основе иерархии шаблонов регулярных выражений.
Он оптимизирован для поиска по совпадению с шаблоном (например, для классификации строк, таких как user agent, по шаблонам регулярных выражений), а не для точного сопоставления ключей.
Использование словаря на основе дерева регулярных выражений с источником YAMLRegExpTree
YAMLRegExpTree, которому передаётся путь к YAML-файлу, содержащему дерево регулярных выражений.
Query
YAMLRegExpTree описывает структуру дерева регулярных выражений. Например:
- regexp: регулярное выражение узла.
- attributes: список пользовательских атрибутов словаря. В этом примере есть два атрибута:
nameиversion. Первый узел определяет оба атрибута. Второй узел определяет только атрибутname. Атрибутversionзадаётся дочерними узлами второго узла.- Значение атрибута может содержать обратные ссылки, указывающие на группы захвата в совпавшем регулярном выражении. В примере значение атрибута
versionв первом узле состоит из обратной ссылки\1на группу захвата(\d+[\.\d]*)в регулярном выражении. Номера обратных ссылок находятся в диапазоне от 1 до 9 и записываются как$1или\1(для номера 1). При выполнении запроса обратная ссылка заменяется соответствующей совпавшей группой захвата.
- Значение атрибута может содержать обратные ссылки, указывающие на группы захвата в совпавшем регулярном выражении. В примере значение атрибута
- child nodes: список дочерних узлов узла дерева регулярных выражений, каждый из которых имеет собственные атрибуты и (потенциально) дочерние узлы. Сопоставление строк выполняется в порядке обхода в глубину. Если строка соответствует узлу regexp, словарь проверяет, соответствует ли она также его дочерним узлам. В этом случае присваиваются атрибуты самого глубокого совпавшего узла. Атрибуты дочернего узла перезаписывают одноимённые атрибуты родительских узлов. Имена дочерних узлов в YAML-файлах могут быть произвольными, например
versionsв приведённом выше примере.
dictGet, dictGetOrDefault и dictGetAll. Например:
Query
Response
\d+/tclwebkit(?:\d+[\.\d]*) со вторым узлом второго уровня.
Затем словарь продолжает поиск в дочерних узлах и обнаруживает, что строка также соответствует 3[12]/tclwebkit.
В результате значение атрибута name равно Android (определено на первом уровне), а значение атрибута version равно 12 (определено в дочернем узле).
С помощью сложного YAML-файла конфигурации вы можете использовать словарь дерева регулярных выражений как парсер строки 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, сначала создайте словарь на основе дерева регулярных выражений из YAML-файла в локальной установке ClickHouse Open Source, затем выгрузите этот словарь в CSV-файл с помощью табличной функции dictionary и оператора INTO OUTFILE.
id UInt64: идентификатор узла RegexpTree.parent_id UInt64: идентификатор родительского узла.regexp String: строка регулярного выражения.keys Array(String): имена пользовательских атрибутов.values Array(String): значения пользовательских атрибутов.
regexp_dictionary_source_table со структурой, приведённой ниже: