Quickwit - محرك بحث محلي السحابة للسجلات (Cheatsheet)
Quickwit هي محرك بحث مصمم لبيانات إلحاق فقط مفتوحة المصدر ومكتوبة بـ Rust — السجلات والتتبعات والأحداث المراجعة — التي تعمل مباشرة على تخزين الكائنات (S3, GCS, Azure). بخلاف Elasticsearch، فإنها لا تحتاج إلى قرص محلي أو ماكينة حالة الكتلة للفهارس، التي تفصل الحوسبة عن التخزين وتجعل الاحتفاظ على نطاق petabyte اقتصادي. تعريض API بحث متوافق مع Elasticsearch وهي خلفية Jaeger أصلية للتتبعات.
التثبيت
| الطريقة | الأمر |
|---|
| سكريبت التثبيت | `curl -L https://install.quickwit.io |
| Docker | docker run -p 7280:7280 quickwit/quickwit run |
| Kubernetes | مخطط Helm متاح |
| بدء عقدة | ./quickwit run |
| واجهة المستخدم / API | http://localhost:7280 |
المفاهيم الأساسية
| المصطلح | المعنى |
|---|
| فهرس | مجموعة بيانات مسماة بخريطة doc |
| تقسيم | شظية مفهرسة غير قابلة للتغيير مخزنة في تخزين الكائنات |
| Metastore | يتتبع الفهارس/التقسيمات (ملف أو PostgreSQL) |
| المصدر | حيث تأتي المستندات (Kafka، ملف، ingest API) |
| أدوار العقدة | indexer، searcher، metastore، control plane |
إنشاء فهرس
# index-config.yaml
version: 0.8
index_id: app-logs
doc_mapping:
field_mappings:
- name: timestamp
type: datetime
fast: true
input_formats: [rfc3339, unix_timestamp]
- name: level
type: text
tokenizer: raw
- name: service
type: text
tokenizer: raw
- name: message
type: text
tokenizer: default
timestamp_field: timestamp
indexing_settings:
commit_timeout_secs: 30
search_settings:
default_search_fields: [message]
quickwit index create --index-config index-config.yaml
استيعاب البيانات
| الطريقة | الأمر |
|---|
| ملف | quickwit index ingest --index app-logs --input-path logs.json |
| Stdin | `cat logs.json |
| Ingest API | POST /api/v1/app-logs/ingest |
| مصدر Kafka | حدد مصدراً في إعداد الفهرس |
| OTLP | نقطة نهاية OpenTelemetry الأصلية للسجلات/التتبعات |
curl -XPOST "http://localhost:7280/api/v1/app-logs/ingest" \
--data-binary @logs.ndjson
البحث
# بحث CLI
quickwit index search --index app-logs --query "level:ERROR AND service:api"
# بحث REST
curl "http://localhost:7280/api/v1/app-logs/search?query=level:ERROR&max_hits=20"
| صيغة الاستعلام | المطابقة |
|---|
term | مصطلح نصي كامل في الحقول الافتراضية |
field:value | تطابق الحقل الدقيق |
a AND b, a OR b, NOT a | المنطق البوليني |
field:[10 TO 100] | نطاق |
"exact phrase" | مطابقة العبارة |
field:prefix* | مطابقة البادئة |
التجميعات والمرشحات الزمنية
# بحث محدود بالوقت (يستخدم حقل الطابع الزمني السريع)
curl "http://localhost:7280/api/v1/app-logs/search?query=*&start_timestamp=1753400000&end_timestamp=1753486400"
Quickwit يدعم تجميعات بنمط Elasticsearch، لذا غالباً ما تنقل الاستعلامات والرسوم البيانية الموجودة مع تغيير قليل.
إدارة الفهارس
| الأمر | الوصف |
|---|
quickwit index list | قائمة الفهارس |
quickwit index describe --index X | إظهار إحصائيات/تقسيمات |
quickwit index clear --index X | حذف جميع المستندات |
quickwit index delete --index X | حذف الفهرس |
quickwit split list --index X | فحص التقسيمات |
الاحتفاظ
retention:
period: 90 days
schedule: daily
لأن التقسيمات تعيش في تخزين الكائنات، الاحتفاظ هو فقط حذف التقسيمات القديمة — رخيصة وسريعة.
التكاملات
| الهدف | ملاحظة |
|---|
| Jaeger | Quickwit هي خلفية تخزين Jaeger الأصلية |
| Grafana | مكون مصدر البيانات للرسوم البيانية |
| OpenTelemetry | استيعاب OTLP الأصلي للسجلات والتتبعات |
| Elasticsearch API | نقاط النهاية للبحث المتوافقة تسهل الهجرة |
Quickwit مقابل البدائل
| الجانب | Quickwit | Elasticsearch | Loki |
|---|
| التخزين | تخزين الكائنات فقط | قرص محلي | تخزين الكائنات |
| فهرس النص الكامل | نعم (بحث حقيقي) | نعم | التصفية المستندة إلى التسميات، محدودة |
| التكلفة في الحجم | منخفضة جداً | عالية | منخفضة |
| التتبعات | خلفية Jaeger الأصلية | إضافات APM | عبر Tempo |
| الأفضل لـ | احتفاظ سجل/تتبع قابل للبحث رخيص | البحث العام | سجلات Grafana-native |
قارن مع Loki و OpenObserve؛ اقترن مع Vector للابتلاع.
الموارد