المستوى المطلوب: متوسط — تحتاج معرفة أساسية بـ Node.js و REST APIs و Docker. لو لسه مبتدئ في الـ APIs، الجزء الأول من المقال هيمشي معاك بمثال بديهي قبل ما ندخل الكود.
لو بتدفع 80 دولار شهري على Elastic Cloud علشان search bar في موقعك بـ 50 ألف منتج، انت بتحرق فلوس. Meilisearch بيعمل نفس الشغل بـ 600MB RAM وتكلفة أقل 5 أضعاف، مع typo tolerance عربي شغّال من غير ما تكتب سطر إعدادات.
بناء Search-as-you-Type عربي بـ Meilisearch و Hono
المشكلة باختصار
الـ search bar في موقع e-commerce عربي بـ 50K منتج محتاج 3 شروط: استجابة أقل من 50ms، تحمّل أخطاء إملائية ("لاب توب" بدل "لابتوب")، ودعم البحث الجزئي وانت بتكتب. Elasticsearch بيعمل ده، لكنه بياكل 4GB RAM في الإعداد الافتراضي ومحتاج JVM tuning. للمشاريع تحت مليون وثيقة، ده over-engineering مكلف.
ليه Meilisearch مش Elasticsearch؟
مثال للمبتدئ: أمين المكتبة الذكي
تخيّل مكتبة فيها 100 ألف كتاب. عندك أمين مكتبة محترف اسمه "إلاستيك" بيعرف 40 لغة، حافظ تاريخ كل كتاب، ويقدر يحلل النصوص بطرق إحصائية معقدة. بس بيقعد في مكتب ضخم، بياخد مرتب كبير، ومحتاج أسبوع تدريب علشان يفهم احتياجاتك بالظبط.
وعندك أمين مكتبة تاني اسمه "ميلي" بيعرف يجاوبك في ثانية واحدة لو سألته عن أي كتاب. لو غلطت في كتابة الاسم بيفهمك. بس مش بيعرف يحلل النصوص أو يفهم استعلامات معقدة. للمكتبة العادية، ميلي كفاية وبيفر 70% من المرتب.
ده الفرق بين Elasticsearch و Meilisearch. الأول instrument جراحة، التاني سكين مطبخ حاد. اختار الأداة على قد المهمة.
التعريف العلمي: Finite State Transducer و Prefix Search
Meilisearch مكتوب بـ Rust وبيستخدم بنية بيانات اسمها Finite State Transducer (FST) لفهرسة الكلمات. الـ FST هي graph موجّه بتمثل كل الكلمات في الفهرس بأقل عدد ممكن من الـ nodes، عن طريق دمج الـ prefixes والـ suffixes المشتركة. النتيجة: فهرس بحجم 30% فقط من حجم الفهرس المكافئ في Lucene (المحرك اللي Elasticsearch مبني عليه).
الـ typo tolerance بيشتغل عبر Levenshtein automaton، اللي بيقدر يحسب المسافة الإملائية بين كلمتين في زمن خطي بدل التربيعي. ده اللي بيخلّيه يرجع نتيجة لـ "لاتبوب" لما المستخدم يقصد "لابتوب" في أقل من ميلي ثانية.
الخطوات بالتفصيل
الخطوة 1: تركيب Meilisearch بـ Docker في 30 ثانية
docker run -d --name meili \
-p 7700:7700 \
-e MEILI_MASTER_KEY="A_long_random_key_min_16_chars_here" \
-e MEILI_ENV="production" \
-v $(pwd)/meili_data:/meili_data \
--restart unless-stopped \
getmeili/meilisearch:v1.10