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

البحث في 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. يوضّح الجدول أدناه كيفية تعامل النظامين مع أنماط البحث الشائعة، مع إبراز أوجه التشابه في الصياغة والاختلافات في التنفيذ في الجهة الخلفية.

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

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