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