البحث الموضوعي في quran-search-engine، الجزء الثاني: الفجوات تُغلَق
قبل أيام نشرتُ الجزء الأول من هذا الموضوع، وأنهيتُه بجملة صريحة: «لم يكتمل بعد»، حيث طرحت أربع فجوات:
الكلمة العربية لا تُفعِّل الموضوع كاملًا، لأن مفاتيح الخريطة إنجليزية فقط، فمن يكتب «غيث» يحصل على 4 آيات فقط، بينما rain يعطي 127.
الكلمة العربية تُبحث بالجذره، لا ضمن مجموعتها، مثال: البحث عن مطر لا يشمل أمطار وممطر.
لا تصحيح للأخطاء الكتابية في الإنجليزية: rrain لا تعطي شيئًا، لأن المطابقة للكلمة دقيقة ولا تحتمل الخطأ.
بيانات المواضيع غير مكتملة: عشرون موضوعًا فقط. البنية سليمة وتؤدي وظيفتها، لكن المعطيات غير كافية.
واليوم أعود لأقول إن الفجوات الثلاث أُغلقت واحدة بعد أخرى، وإن الإصدار الثاني من خاصية البحث الموضوعي أصبح جاهزًا.
1. خلاصة الجزء الأول
البحث الموضوعي يكتب فيه المستخدم مفهومًا واحدًا مثل rain، فيحوّله المحرّك إلى مجموعة ألفاظ عربية تنتمي إلى الموضوع نفسه، ثم يبحث عنهاها دفعة واحدة. والمطابقة تمرر إلى الجذر وأصل الكلمة، حتى لا يتلوّث الموضوع بـ «ماء» داخل «سماء». كان الأساس صحيحًا:
- خريطة من المفهوم إلى الكلمات
- مطابقة بالجذر
- فهرس موضوعي يُبنى مسبقًا.
لكنني ذكرتُ وجود ثلاث فجوات بصراحة:
الكلمة العربية لا تُفعِّل الموضوع كاملًا، لأن مفاتيح الخريطة إنجليزية، فمن يكتب «غيث» يحصل على آيات قليلة بينما rain يعطي 127.
لا تصحيح للأخطاء الكتابية: rrain يعود بصفر لأن المطابقة دقيقة.
البيانات غير مكتملة: عشرون موضوعًا فقط.
وهذه الفجوات هي بالضبط ما عملنا عليه بعد نشر الموضوع الأول.
2. الفجوة الأولى: الكلمة العربية تُفعِّل موضوعها الآن
كانت البنية تقول شيئًا وتفعل عكسه: الكلمة العربية مثل «مطر» أو «غيث» موجودة في الخريطة، لكنها قيمة فقط ولا تصلح مفتاحًا، فتسقط إلى بحث جذري عادي بدل أن تُفعِّل موضوعها. والإصلاح كان صغيرًا في حجمه كبيرًا في أثره: عادت دالة بناء الخريطة تُسجّل كل كلمة عربية مفتاحًا يقود إلى قائمة كلمات موضوعها، مع الحفاظ على دمج الموضوعات عند التشارك في لفظ واحد.
قبل، «غيث» يعطي 4 آيات، و«مطر» 9. وبعد: كلاهما يعطي 127 آية، تمامًا مثل rain. وحين تشترك كلمة في أكثر من موضوع، تجتمع موضوعاتها تلقائيًا: البحث عن «ماء» صار يجمع موضوعَي الخلق والطعام، 1073 آية بعد أن كان 61. وهنا يظهر أثر البنية الطبقيّة: لم نمسّ منطق المطابقة القائم، بل مدّدنا الخريطة فقط. (#122)
3. الفجوة الثانية: الأخطاء الكتابية لم تعد تعود بصفر نتيجة
كانت الطبقة تتجاهل خيار البحث الضبابي (fuzzy) تمامًا، فكلمة فيها خطأ كتابي تعيد 0 نتيجة، بينما كل الطبقات الأخرى في المحرّك تتسامح مع الخطأ. أضفنا إلى جانب المطابقة الدقيقة مطابقة ضبابية على المفاتيح الإنجليزية، بالحدود نفسها المستخدمة في البحث، مع تخزين فهرس مؤقت لكل خريطة على حدة حتى لا تتسرّب نتيجة خريطة إلى أخرى.
النتيجة: rrain وclimte تعيدان اليوم نتائج rain وclimate نفسها، 127 آية لكل منهما، وworshp تعيد 1346 آية مثل worship. أما كلمة لا صلة لها بالموضوع فتبقى تعيد صفرًا، لأن الحدّ الضبابي صارم ولا يتساهل مع كل خطأ في الكتابة. (#123)
4. الفجوة الثالثة: البيانات صار لها صيغة ثابتة (schema)
الفجوة الثالثة لا تُغلق بإضافة موضوعات فقط، بل بجعل إضافتها آمنة. كان ملفّا subjects.json وphonetic.json الوحيدين من بين ستة ملفات بيانات بلا متحقّق من صحة المخطط (schema)، فأي خطأ فيهما كان يظهر كخطأ عام غامض بدل أن يدلّ على مكانه بدقة. أضفنا المُتحقّقين validateSubjectData وvalidatePhoneticData على غرار الأربعة القائمة، فصار الخطأ يشير إلى مساره، مثل subjects[3].arabic. (#125)
أما إثراء البيانات نفسه، فبقي كما وعدتُ في الجزء الأول: مرحلة لاحقة. والطريق إليه واضح الآن، إما بمساهمة مجتمعية، أو باستعمال مصدر جاهز مثل QUL أو الموسوعة القرآنية Quranpedia التي رشّحتها الأخت @علا صالح في التعليقات. البنية جاهزة، والاختيار متروك لما بعد اكتمال الخاصية.
5. المراحل التي مازال العمل جاريا عليها
في «الخطوة القادمة» ذكرتُ أن دعم سطر الأوامر مرحلة منفصلة. وقد أنجزناه في طلب دمج (#124) لا يزال قيد المراجعة وسيُدمج قريبًا إن شاء الله: صار للـ CLI علم --subject، فيُضاف البحث الموضوعي إلى نتائج البحث العادي بدل أن يبقى حبيس المكتبة. تجربة سريعة: rain --subject يعطي 185 مطابقة دقيقة و124 مطابقة موضوعية فوقها، بينما rain وحده يبقى 185. وباكتمال هذا العلم ينتقل العمل إلى مرحلته القادمة: إثراء ملف البيانات subjects.json نفسه.
6. ملاحظة مهمة: ملف البيانات
طوال تطوير الإصدارين لم نُغفل أهمية ملف بيانات المواضيع subjects.json، بل شكّلناه تدريجيًا: نسخة أساسية في الإصدار الأول، ثم تحديث وتثبيت مع إضافة التحقق من صحة المخطط في الإصدار الثاني. والآن صارت لدينا رؤية واضحة للبيانات وشكلها ومخططها (schema)، وهذا ما يجعل إثراءها الخطوة القادمة أوضح.
7. الخلاصة
انتقل البحث الموضوعي في عشرة أيام من قائمة «ما لم يكتمل» إلى قائمة «ما اكتمل». لم يتغيّر جوهر الفكرة، لكن صار بابها مفتوحًا لغير الناطق بالإنجليزية، ومتسامحًا مع الخطأ الكتابي، والبيانات محمية. وهذا كله جهد مساهم واصل من أول طلب دمج إلى آخر إصلاح: الأخ @Eslam Wael، شكرًا لك على الصبر والإصرار، وعلى العودة إلى الميزة أربع مرات حتى استقرّت.
الخطوة القادمة إنشاء الله هي إثراء البيانات.
المصادر والروابط