السؤال · فصل ١

SQL ولا محرك بحث؟

Exact lookup vs search experience
🎯 الهدف: تفرّق بين دور على قيمة معروفة ودور بيبيع تجربة البحث، وتعرف ليه الاتنين ممكن يعيشوا في نفس السيستم.

الإنترفيو بيبدأ بالمطلوب مش باسم الأداة

عندك عشر مليون منتج. المنتج والأوردر والمخزون والدفع قاعدين في SQL. البزنس عايز سيرش اليوزر يقدر يعيش بيه:

يكتب iPhone 15 Pro والموبايل يظهر قبل الكفرلو كتب ifone يلاقي نتيجة قريبةيفلتر brand و RAM و price و stock و ratingيشوف عدد المنتجات جنب كل brandأول حروف تطلّع اقتراحاتالكلمة جوه description طويلة تتشاف في مقطع صغيريفضل سريع لو العدد بقى خمسين مليون

SQL ممتازة لما بتدور على حاجة معروفة

رقم أوردر، إيميل، SKU، رقم فاتورة. دي قيم معروفة، ولو عملت index صح على العمود، Postgres و SQL Server بيرجعوا الصف بسرعة. مش بتقارن “أنهي نتيجة أحسن”. يا الصف ده يا لأ.

Exact search

WHERE sku = 'APL-IP15P-256'. الـ index بيوصّلك للصف. عشرين مليون صف مش مشكلة لو الشرط ده.

Search experience

جملة ناقصة، غلطة إملائي، ترتيب بالنِيّة، أعداد جنب الفلاتر. هنا SQL لسه موجودة، بس مش هي أداة البحث.

LIKE بيبدأ كويس وبعدين الأسئلة بتخلص

في أول نسخة من المتجر ممكن تكتب:

SELECT id, nameFROM productsWHERE name ILIKE '%iphone%' OR description ILIKE '%iphone%';

على كام ألف منتج ممكن تعدّي. % في أول الكلمة غالبًا بتلغي فايدة الـ B-tree index، فالداتابيز بتمسح صفوف كتير. ولسه متجاوبتش على الأسئلة اللي اليوزر حاسس بيها:

  • ظهور الكلمة في name أهم من ظهورها في description؟
  • الكفر “compatible with iPhone 15 Pro” ليه طالع فوق الموبايل نفسه؟
  • ifone يرجّع ولا يقول مفيش نتائج؟
  • عدد المنتجات لكل brand، والاقتراحات وأنت بتكتب، ومقطع الـ description اللي فيه الماتش؟

Postgres عنده full-text search (tsvector) وده أحسن من LIKE بكتير للبحث بالنص. الأداة مش هي الحكم. الحكم: هل محتاج ranking و typos و facets و autocomplete على تجربة بحث أساسية، ولا لأ.

باب البحث غير باب البيزنس

حتى لو ركّبت Elasticsearch، الـ SQL مش بتمشي. الأوردر والفلوس والعلاقات والـ constraints محتاجين transactions. الداتابيز بتفضل source of truth. Elasticsearch بيبقى search index: نسخة متشكّلة عشان البحث، مش عشان تتحاسب منها.

باب البحث غير باب البيزنس
  1. اليوزر ← Express: بحث أو شراء
  2. Express ← اليوزر: الرد
  3. Express ← Elasticsearch: search
  4. Express ← SQL: transaction

اليوزر مش بيعرف الفرق. الـ API هو اللي بيفرق: صفحة النتائج تسأل Elasticsearch، والـ checkout يسأل SQL. المخزون اللي اتخصم لحظة الدفع بيتقرأ من SQL، حتى لو سيرش من ثواني كان لسه كاتب “متوفر”.

🧪 Lab

اكتب لتلات شاشات في المتجر: البحث هيروح فين؟

  1. خانة البحث في الصفحة الرئيسية.
  2. شاشة الدعم اللي بتلصق فيها رقم الأوردر.
  3. تقرير “كل منتجات Apple تحت ٢٠ ألف” جوه لوحة الأدمن، من غير ترتيب بالنِيّة.

الأولى محرك بحث لو التجربة محتاجة ranking و typos. التانية SQL بإندكس على رقم الأوردر. التالتة غالبًا SQL كمان: الفلاتر معروفة ومفيش نص حر. القرار مش “عندنا كام صف”.

✅ الخلاصة — Checklist

🧠 اختبر نفسك
١) ليه البحث برقم الأوردر مش محتاج Elasticsearch؟
لأنك بتدور على قيمة معروفة، والإندكس على العمود بيوصّلك للصف من غير ranking ولا تحليل نص.
٢) إيه اللي LIKE مش بيجاوب عليه؟
مين النتيجة الأقرب لنِيّة اليوزر، والغلط الإملائي، وأعداد الفلاتر، والاقتراحات، ومقطع الماتش.
٣) لو ركّبت Elasticsearch، الأوردر يتسجل فين؟
في SQL. محرك البحث مش مكان الـ transactions ولا الـ constraints.