نظرة عامة
regexp_tree ربط المفاتيح بالقيم استنادًا إلى أنماط تعابير نمطية هرمية.
وهو مُحسَّن لعمليات lookup المعتمدة على مطابقة الأنماط (مثل تصنيف السلاسل النصية، كسلاسل user agent، عبر مطابقة أنماط regex) بدلًا من المطابقة الدقيقة للمفاتيح.
استخدام قاموس شجرة التعبيرات النمطية مع مصدر 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، ويمكنك الاطلاع على كيفية استخدامه في الاختبار functional 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 مفتوح المصدر، لكنه لا يعمل في ClickHouse Cloud.
لاستخدام قواميس شجرة التعبيرات النمطية في ClickHouse Cloud، أنشئ أولًا محليًا في ClickHouse مفتوح المصدر قاموس شجرة تعبيرات نمطية من ملف YAML، ثم صدّر هذا القاموس إلى ملف CSV باستخدام دالة الجدول dictionary وبند INTO OUTFILE.
id UInt64: معرّف عقدةRegexpTree.parent_id UInt64: معرّف العقدة الأب لإحدى العقد.regexp String: سلسلة التعبير النمطي.keys Array(String): أسماء السمات التي يحدّدها المستخدم.values Array(String): قيم السمات التي يحدّدها المستخدم.
regexp_dictionary_source_table ببنية الجدول التالية: