الانتقال إلى المحتوى الرئيسي

البحث في ClickStack وElastic

ClickHouse هو محرك أصيل لـ SQL، صُمِّم من البداية لأحمال العمل التحليلية عالية الأداء. وعلى النقيض من ذلك، يوفّر Elasticsearch واجهة شبيهة بـ SQL، إذ يترجم SQL إلى لغة query DSL الأساسية في Elasticsearch، ما يعني أن دعمها ليس أصيلًا بشكل كامل وأن تكافؤ الميزات فيه محدود. لا يكتفي ClickHouse بدعم SQL بالكامل، بل يوسّعها أيضًا بمجموعة من الدوال الموجّهة لحالات الرصد، مثل argMax وhistogram وquantileTiming، ما يسهّل الاستعلام عن السجلات المنظَّمة والمقاييس والتتبعات. لاستكشاف السجلات والتتبعات البسيطة، توفّر واجهة ClickStack UI ‏(HyperDX) صياغة بأسلوب Lucene لتصفية نصية سهلة وبديهية لاستعلامات الحقل-القيمة، والنطاقات، وأحرف البدل، وغير ذلك. وهذا مماثل لـ صياغة Lucene في Elasticsearch وبعض عناصر Kibana Query Language. تدعم واجهة البحث هذه الصياغة المألوفة، لكنها تترجمها في الخلفية إلى عبارات SQL WHERE فعّالة، مما يجعل التجربة مألوفة لمستخدمي Kibana مع إتاحة الاستفادة من قوة SQL عند الحاجة. ويتيح لك ذلك الاستفادة من المجموعة الكاملة من دوال البحث في السلاسل النصية ودوال التشابه ودوال التاريخ والوقت في ClickHouse. فيما يلي، نقارن بين لغات استعلام Lucene في ClickStack وElasticsearch.

صياغة البحث في ClickStack مقابل query string في Elasticsearch

يوفّر كلٌّ من ClickStack وElasticsearch لغات استعلام مرنة تتيح تصفية السجلات والتتبعات بصورة بديهية. وبينما تكون query string في Elasticsearch مدمجة بإحكام مع DSL ومحرك الفهرسة الخاص به، يدعم ClickStack صياغة مستوحاة من Lucene تُترجم داخليًا إلى ClickHouse SQL. يوضّح الجدول أدناه كيفية تعامل النظامين مع أنماط البحث الشائعة، مع إبراز أوجه التشابه في الصياغة والاختلافات في التنفيذ في الجهة الخلفية.
الميزةصياغة ClickStackصياغة Elasticsearchملاحظات
البحث النصي الحرerrorerrorيطابق جميع الحقول المفهرسة؛ وفي ClickStack تُعاد كتابته إلى SQL متعدد الحقول باستخدام ILIKE.
مطابقة الحقلlevel:errorlevel:errorالصياغة متطابقة. ويطابق ClickStack قيم الحقول مطابقة تامة في ClickHouse.
البحث بالعبارة"disk full""disk full"يطابق النص بين علامتَي اقتباس تسلسلاً مطابقًا تمامًا؛ ويستخدم ClickHouse مساواة السلاسل أو ILIKE.
مطابقة عبارة داخل حقلmessage:"disk full"message:"disk full"تُترجم إلى SQL ILIKE أو إلى تطابق تام.
شروط ORerror OR warningerror OR warningOR منطقي بين المصطلحات؛ ويدعم النظامان ذلك بصورة أصلية.
شروط ANDerror AND dberror AND dbيترجمه كلاهما إلى تقاطع؛ ولا يوجد اختلاف في الصياغة من منظور المستخدم.
النفيNOT error or -errorNOT error or -errorمدعوم بالطريقة نفسها؛ ويحوّله ClickStack إلى SQL NOT ILIKE.
التجميع(error OR fail) AND db(error OR fail) AND dbتجميع Boolean قياسي في كليهما.
Wildcardserror* or *fail*error*, *fail*يدعم ClickStack wildcards في البداية أو النهاية؛ بينما يعطّل ES wildcards البادئة افتراضيًا لأسباب تتعلق بالأداء. ولا يدعم wildcards داخل المصطلحات، مثل f*ail. ويجب تطبيق wildcards مع مطابقة حقل.
النطاقات (رقمية/تاريخ)duration:[100 TO 200]duration:[100 TO 200]يستخدم ClickStack عبارة SQL BETWEEN؛ بينما يوسّع Elasticsearch ذلك إلى استعلامات نطاق. ولا يتم دعم * غير المقيّد داخل النطاقات مثل duration:[100 TO *]. وعند الحاجة، استخدم Unbounded ranges أدناه.
النطاقات غير المقيّدة (رقمية/تاريخ)duration:>10 or duration:>=10duration:>10 or duration:>=10يستخدم ClickStack معاملات SQL القياسية
شامل/حصريduration:{100 TO 200} (exclusive)Sameتشير {} إلى حدود حصرية. ولا يتم دعم * داخل النطاقات، مثل duration:[100 TO *]
فحص الوجودN/A_exists_:user or field:*_exists_ غير مدعوم. استخدم LogAttributes.log.file.path: * لأعمدة Map مثل LogAttributes. أما الأعمدة الجذرية، فيجب أن تكون موجودة وسيكون لها قيمة افتراضية إذا لم تُضمَّن في الحدث. وللبحث عن قيمة افتراضية أو الأعمدة المفقودة، استخدم الصياغة نفسها في Elasticsearch: ServiceName:* أو ServiceName != ''.
Regexmatch functionname:/joh?n(ath[oa]n)/غير مدعوم حاليًا في صياغة Lucene. يمكنك استخدام SQL والدالة match أو غيرها من string search functions.
المطابقة التقريبيةeditDistance('quikc', field) = 1quikc~غير مدعوم حاليًا في صياغة Lucene. يمكن استخدام دوال المسافة في SQL مثل editDistance('rror', SeverityText) = 1 أو other similarity functions.
البحث بالتقاربNot supported"fox quick"~5غير مدعوم حاليًا في صياغة Lucene.
تعزيز الأهميةquick^2 foxquick^2 foxغير مدعوم في ClickStack في الوقت الحالي.
wildcard للحقلservice.*:errorservice.*:errorغير مدعوم في ClickStack في الوقت الحالي.
الأحرف الخاصة المُهربةEscape reserved characters with \Sameيلزم تهريب الرموز المحجوزة.

اختلافات الوجود/الفقدان

على عكس Elasticsearch، حيث يمكن إغفال حقل بالكامل من حدث ما وبالتالي لا “يكون موجودًا” فعليًا، يتطلب ClickHouse وجود جميع الأعمدة في مخطط الجدول. وإذا لم يتم تمرير حقل في حدث insert:
  • بالنسبة إلى الحقول Nullable، فستُضبط قيمته على NULL.
  • بالنسبة إلى الحقول غير القابلة لأن تكون NULL (وهو الخيار الافتراضي)، فستُملأ بقيمة افتراضية (غالبًا سلسلة فارغة أو 0 أو ما يعادل ذلك).
في ClickStack، نستخدم الحالة الثانية لأن Nullable غير موصى به. ويعني هذا السلوك أن التحقق مما إذا كان الحقل “موجودًا” بالمعنى المقصود في Elasticsearch ليس مدعومًا بشكل مباشر. بدلًا من ذلك، يمكنك استخدام field:* أو field != '' للتحقق من وجود قيمة غير فارغة. لذلك لا يمكن التمييز بين الحقول المفقودة فعليًا والحقول الفارغة صراحةً. عمليًا، نادرًا ما يسبب هذا الاختلاف مشكلات في حالات استخدام الرصد، لكن من المهم أخذه في الاعتبار عند ترجمة الاستعلامات بين الأنظمة.
آخر تعديل في ٢٩ يونيو ٢٠٢٦