انتقل إلى المحتوى الرئيسي
شرح تطبيقي

البحث النصي الكامل (Full-Text Search) في PostgreSQL للغتين العربية والإنجليزية في الإمارات العربية المتحدة

7 دقائق قراءة

دليل عملي لأصحاب الأعمال في الإمارات لتطبيق البحث ثنائي اللغة في PostgreSQL. تعلّم كيفية معالجة تحليل الكلمات العربية وتحسين تجربة المستخدم.

PostgreSQLArabic SearchWeb DevelopmentUAE BusinessBilingual SEO

إذا كنت تدير منصة رقمية في الإمارات العربية المتحدة، فإن مستخدميك يتوقعون البحث باللغتين العربية والإنجليزية بسلاسة. سواء كانوا يبحثون عن منتجات أو خدمات أو معلومات، فإن القدرة على كتابة "نخيل" أو "palm tree" والحصول على نتائج دقيقة لم تعد رفاهية - بل هي متطلب أساسي لممارسة الأعمال التجارية هنا. ومع ذلك، تفشل العديد من إعدادات قواعد البيانات القياسية في التعامل مع اللغة العربية بشكل صحيح تلقائياً. يشرح هذا الدليل كيفية تهيئة إمكانيات البحث النصي الكامل في PostgreSQL للغتين العربية والإنجليزية بفعالية، مما يضمن أن تطبيقك يخدم السوق الإماراتي بأكمله، من أبوظبي إلى دبي وما بعدها.

بصفتي مطور Full-Stack مقيم في أبوظبي، قمت ببناء العديد من المنصات ثنائية اللغة لعملاء في جميع أنحاء دول مجلس التعاون الخليجي. أحد أكثر العقبات التقنية شيوعاً التي أواجهها هو جعل وظيفة البحث تعمل بشكل جيد بنفس القدر للمحتوى من اليمين إلى اليسار (العربية) ومن اليسار إلى اليمين (الإنجليزية). سأقوم أدناه بتفصيل التحديات التقنية والحلول التي تعمل بالفعل في بيئات الإنتاج.

لماذا تفشل إعدادات PostgreSQL الافتراضية في التعامل مع اللغة العربية

يُعد PostgreSQL قاعدة بيانات قوية، لكن تكويناتها الافتراضية للبحث النصي تميل بشدة نحو اللغات اللاتينية. عندما تستخدم الإعدادات القياسية للغة العربية، غالباً ما تتعامل قاعدة البيانات مع النص كتيار من الأحرف دون فهم الفروق اللغوية الدقيقة الخاصة باللغة.

تشمل المشكلات الرئيسية ما يلي:

  • • الحركات (التشكيل): تستخدم اللغة العربية علامات (التشكيل) للإشارة إلى النطق. البحث عن كلمة بدون حركات لن يتطابق مع نفس الكلمة مع الحركات ما لم تتم التسوية (normalization).
  • • كلمات التوقف (Stopwords): الكلمات الشائعة مثل "ال" (the) تظهر بشكل متكرر. إذا لم يتم التعامل معها بشكل صحيح، فقد تؤثر على درجات الصلة أو تسبب أخطاء في الفهرسة.
  • • التجذير (Stemming): جذور الكلمات العربية معقدة. يجب معاملة كلمة "نخيل" و"النخيل" ككلمات ذات صلة، لكن أدوات تحليل الكلمات الافتراضية قد تراها كسلاسل مختلفة تماماً.

بالنسبة لأصحاب الأعمال في الإمارات، هذا يعني أنه إذا قام مطورك ببساطة بتشغيل البحث النصي الكامل دون تخصيص، فمن المحتمل أن يجد عملاؤك الناطقون باللغة العربية نتائج صفرية أو بيانات غير ذات صلة. هذا يخلق تجربة مستخدم مجزأة حيث يحصل المتحدثون باللغة الإنجليزية على خدمة رائعة، بينما يواجه المتحدثون باللغة العربية إحباطاً.

إصلاح تحليل الكلمات العربية والتسوية

لجعل البحث يعمل، يجب علينا تسوية النص قبل أن يدخل إلى فهرس البحث. هذه العملية تزيل الاختلافات التي تربك قاعدة البيانات مع الحفاظ على المعنى الأساسي سليماً.

الخطوة 1: إزالة الحركات (التشكيل)

الخطوة الأولى هي استخدام امتداد unaccent. هذا يزيل علامات النطق، مما يسمح بمعاملة "كِتَاب" و"كتاب" ككلمة واحدة.

sql
CREATE EXTENSION IF NOT EXISTS unaccent;

يمكنك بعد ذلك تطبيق هذا على أعمدة المحتوى العربي أثناء عملية الفهرسة. يضمن هذا أن المستخدمين لا يحتاجون إلى كتابة الحركات الدقيقة للعثور على ما يبحثون عنه.

الخطوة 2: إنشاء تهيئة بحث نصي مخصصة

يسمح لك PostgreSQL بإنشاء قواميس مخصصة. للغة العربية، أوصي بنسخ تهيئة simple وتعديلها للتعامل مع كلمات التوقف العربية وقواعد التجذير بشكل أكثر فعالية.

sql
CREATE TEXT SEARCH CONFIGURATION arabic_custom (COPY = simple);

بينما لا تقوم تهيئة simple بأداء تجذير مكثف، إلا أنها غالباً ما تكون أكثر موثوقية للبيئات متعددة اللغات من محاولة فرض قاموس عربي معقد قد لا يغطي جميع اللهجات المستخدمة في الإمارات. يمكنك تحسين هذا عن طريق إضافة كلمات توقف عربية محددة لمنع الكلمات الشائعة من إرباك الفهرس.

الخطوة 3: فهرسة البيانات

بمجرد أن يصبح التكوين جاهزاً، يمكنك إنشاء عمود tsvector يخزن النص المعالج. هذا العمود هو ما تبحث عنه قاعدة البيانات فعلياً.

sql
ALTER TABLE your_table ADD COLUMN search_vector_ar tsvector;
CREATE INDEX idx_search_vector_ar ON your_table USING GIN (search_vector_ar);

يُعد استخدام GIN (Generalized Inverted Index) أمراً حاسماً للأداء. بدونها، يتطلب كل بحث مسحاً كاملاً للجدول، مما يصبح بطيئاً بشكل لا يمكن استخدامه مع نمو بياناتك.

دمج العربية والإنجليزية في بحث موحد

معظم المواقع الإماراتية ثنائية اللغة. غالباً ما يتنقل المستخدمون بين اللغات أو يتوقعون شريط بحث واحد للاستعلام عن كليهما. لتحقيق ذلك، تحتاج إلى دمج المتجهات الإنجليزية والعربية في حقل واحد قابل للبحث.

نهج شائع هو إنشاء عرض مادي (materialized view) أو عمود مُنشأ (generated column) يدمج النص الإنجليزي والعربي المُسوى.

sql
UPDATE your_table 
SET search_vector_combined = 
  to_tsvector('english', coalesce(content_en, '')) || 
  to_tsvector('arabic_custom', coalesce(content_ar_normalized, ''));

لاحظ استخدام coalesce للتعامل مع القيم الفارغة (null). إذا كان الصف يحتوي على محتوى إنجليزي فقط، فإن الجزء العربي يكون فارغاً، والعكس صحيح. يقوم عامل التشغيل || بدمج المتجهين. يسمح هذا للمستخدم بكتابة استعلام بأي من اللغتين واسترداد النتائج ذات الصلة من كلا مجموعتي البيانات.

يُعد هذا الإعداد مهماً بشكل خاص لـ تطوير المواقع العربية وثنائية اللغة، حيث يعد التكافؤ في المحتوى أمراً أساسياً. يضمن أن منطق قاعدة بياناتك يدعم تجربة الواجهة الأمامية (frontend)، بغض النظر عن اللغة التي يفضلها المستخدم.

اعتبارات الأداء للأعمال التجارية في الإمارات

عند بناء مشاريع تطوير تطبيقات الويب المخصصة، يعد الأداء أمراً بالغ الأهمية. فيما يلي ثلاثة عوامل يجب وضعها في الاعتبار:

  1. حجم الفهرس: يمكن أن تنمو فهارس GIN لتصبح كبيرة، خاصة مع النصوص متعددة اللغات. راقب حجم قاعدة البيانات الخاصة بك وتأكد من أن خادمك يحتوي على ذاكرة كافية للاحتفاظ بالفهرس في ذاكرة الوصول العشوائي (RAM) للوصول السريع.
  2. مشغلات التحديث (Update Triggers): كلما قمت بإدخال أو تحديث محتوى، يجب إعادة إنشاء متجه البحث. استخدم مشغل قاعدة بيانات لأتمتة هذا. القيام بذلك يدوياً في كود التطبيق عرضة للخطأ ويؤدي إلى نتائج بحث قديمة.
  3. تجنب أحرف البدل (Wildcards): لا تستخدم LIKE '%keyword%' للبحث. فهو يتجاوز الفهرس ويمسح كل صف. استخدم دائماً عامل التشغيل @@ مع to_tsquery للبحث النصي الكامل.

بالنسبة للمواقع ذات حركة المرور العالية، مثل تلك الموجودة في قطاع تطوير مواقع التجارة الإلكترونية، يمكن أن تعني هذه التحسينات الفرق بين وقت استجابة يقل عن ثانية وخطأ انتهاء المهلة.

تطبيق عملي في سوق الإمارات العربية المتحدة

لقد طبقت هذه المبادئ في مشاريع مختلفة، من منصات العقارات إلى تطبيقات التجزئة. على سبيل المثال، في مشروع تطوير تطبيقات الهاتف المحمول الأخير، كان المستخدمون بحاجة إلى البحث عن العناصر باللغتين العربية والإنجليزية. من خلال تنفيذ خطوات التسوية المذكورة أعلاه، ضمننا أن تكون نتائج البحث متسقة بغض النظر عن لغة الإدخال.

وبالمثل، بالنسبة لخدمات تطوير الويب في أبوظبي، أنصح العملاء غالباً بأن الدعم ثنائي اللغة لا يقتصر على الترجمة فحسب، بل يتعلق بالتنفيذ الفني. يجب أن تفهم قاعدة البيانات بنية كلتا اللغتين لتقديم تجربة مستخدم احترافية.

إذا كنت تخطط لمنصة جديدة أو ترقية منصة موجودة، فتذكر أنه يجب تضمين دعم اللغة العربية في البنية الأولية. إعادة تهيئة وظيفة البحث لاحقاً أكثر تكلفة وتعقيداً بكثير. كما هو مذكور في عروض خدماتي، يتم تضمين الدعم العربي وثنائي اللغة في كل مشروع أقوم به، مما يضمن أن حزمتك التقنية جاهزة لسوق الإمارات العربية المتحدة من اليوم الأول.

الأسئلة الشائعة

هل يدعم PostgreSQL اللغة العربية بشكل أصلي؟

يدعم PostgreSQL ترميز UTF-8، والذي يمكنه تخزين الأحرف العربية. ومع ذلك، فإن تكويناته الافتراضية للبحث النصي الكامل لا تتعامل مع اللغويات العربية (مثل التجذير والحركات) بشكل جيد. يجب عليك إنشاء تكوينات مخصصة وتسوية النص للحصول على نتائج بحث دقيقة.

هل يمكنني البحث باللغتين العربية والإنجليزية في نفس الوقت؟

نعم. من خلال إنشاء أعمدة tsvector منفصلة لكل لغة ودمجها باستخدام عامل التشغيل ||، يمكنك إنشاء فهرس بحث موحد. يسمح هذا لاستعلام واحد بإرجاع النتائج من حقول المحتوى الإنجليزية والعربية.

لماذا لا يعرض بحثي العربي أي نتائج؟

يرجع هذا عادةً إلى الحركات (التشكيل) أو كلمات التوقف غير المتطابقة. إذا كان فهرسك يحتوي على نص به حركات ولكن المستخدم يبحث بدونها (أو العكس)، فسيفشل التطابق. استخدام امتداد unaccent لتسوية النص قبل الفهرسة يحل هذه المشكلة.

هل أحتاج إلى خادم خاص للبحث ثنائي اللغة؟

ليس بالضرورة. ومع ذلك، تستهلك فهارس GIN للبحث النصي الكامل ذاكرة وتخزيناً أكبر من فهارس B-tree القياسية. تأكد من أن خادم قاعدة البيانات الخاص بك يحتوي على موارد كافية، خاصة إذا كان لديك كمية كبيرة من بيانات النص.

كم يستغرق تطبيق البحث ثنائي اللغة؟

بالنسبة لتطبيق ويب مخصص قياسي، يضيف تطبيق البحث ثنائي اللغة القوي عادةً بضعة أيام إلى الجدول الزمني للتطوير. يتضمن ذلك إعداد مخطط قاعدة البيانات، وإنشاء المشغلات (triggers)، واختبار منطق التسوية. بالنسبة للمشاريع المعقدة، يتم التعامل مع هذا خلال مرحلة تطوير تطبيقات الويب المخصصة.

S

سارة

مطوّرة Full-Stack أولى ومعتمدة PMP — أبوظبي، الإمارات

أكثر من 7 سنوات في بناء تطبيقات ويب لشركات الإمارات والخليج. متخصصة في Laravel وNext.js وتطوير مواقع RTL العربية.

تعاون مع سارة