التصاميم · فصل ١٣

تصميم Search Autocomplete

Trie · top-k · aggregation · shard map
🎯 الهدف: تكتب "sys" فيظهرلك أشهر ٥ عمليات بحث بتبدأ بيها، في أقل من ١٠٠ ملي ثانية.

المطلوب

تكتب sys فيظهرلك أشهر ٥ عمليات بحث بتبدأ بيها. لازم يكون سريع جدًا (تقريبًا أقل من ١٠٠ms)، مرتب بالشهرة، ويستحمل ترافيك عالي.

الـ Trie

شجرة كل نود فيها حرف، وكل مسار من الجذر = كلمة. البحث عن prefix = تمشي في الشجرة.

تحسينين أساسيين بيخلوا الاقتراح يطلع من غير ما تلف على الشجرة كلها:

  1. حدّد طول الـ prefix (الناس نادرًا بتكتب طويل) فتوصل للنود بسرعة.
  2. خزّن top-k في كل نود. مش محتاج تلف على كل الفروع، النتيجة جاهزة. بتدفع ميموري أكتر مقابل سرعة.

خدمتين منفصلتين

  • Data gathering: مش real-time. الـ trie بيتبني من جديد كل أسبوع مثلًا. إلا لو زي تويتر محتاج تحديث أسرع.
  • Query service: بيقرا من الكاش. تسريع إضافي: AJAX، كاش البراوزر (Cache-Control)، و data sampling في اللوجز.
  • Filter layer: يشيل الاقتراحات المسيئة أو الخطيرة قبل ما توصل لليوزر.
  • Sharding: التقسيم بأول حرف مش عادل (حروف أشهر من حروف). Shard Map Manager يوزّع حسب الحجم الحقيقي للداتا.

Checklist الـ Autocomplete

🧠 اختبر نفسك
١) ليه نخزن top-k في كل نود؟
عشان الاقتراح يبقى جاهز ومتلفش على كل الفروع في كل ضغطة حرف.
٢) ليه بناء الـ trie مش real-time في أغلب الأنظمة؟
لأن تجميع اللوجز تقيل، والشهرة مش بتتغير كل ثانية. أسبوع غالبًا كفاية.
٣) ليه التقسيم بأول حرف وحش؟
لأن فيه حروف عليها ترافيك أضعاف حروف تانية، فـ shard واحد يتضرب والباقي فاضي.
٤) إيه اللي بيوصل لليوزر قبل الاقتراحات؟
طبقة فلتر بتشيل الكلمات المسيئة أو الخطيرة.