قاموس مخصص للبحث النصي الكامل في Postgres

إذن، ها هو حكاية عن سعيي لتحسين البحث في مثيلة منتدى باللغة التشيكية.

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

تمكنت من معرفة كيفية إضافة القاموس وجعله يعمل داخل حاوية Docker (التفاصيل أدناه)، لكنني لم أستطع جعله يعمل حتى بعد إعادة الفهرسة. اتضح أن Discourse يختار القاموس بناءً على إعدادات default_locale، ويختاره فقط للغات المرفقة مع Postgres — ويستخدم قاموس simple لجميع اللغات الأخرى.

من فضلكم، هل يمكننا إضافة إعداد موقع إضافي لتحديد قاموس بحث مخصص؟
لقد تأكدت من أن كل شيء يبدأ بالعمل عندما قمت بتعديل lib/search.rb يدوياً.

إليك ما فعلته لإضافة القاموس، مع إعادة تكرار الخطوات من هنا:

وهنا:

sudo ./launcher enter app
# يجب أيضًا إضافة ما يلي إلى container/app.yml ليتم تنفيذه عند إعادة بناء الحاوية في كل مرة
curl -L https://github.com/freaz/docker-postgres-czech-unaccent/raw/master/czech_unaccent.tar.gz | tar -xzC /tmp/ && mv /tmp/fulltext_dicts/czech* /usr/share/postgresql/1?/tsearch_data/
sudo -u postgres psql discourse
CREATE TEXT SEARCH DICTIONARY czech
   (template=ispell, dictfile = czech_unaccent, afffile=czech_unaccent, stopwords=czech_unaccent);
CREATE TEXT SEARCH CONFIGURATION czech (copy=english);
ALTER TEXT SEARCH CONFIGURATION czech
  ALTER MAPPING FOR word, asciiword WITH cspell, simple;
# تحقق
\dF
# اختبر
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# في containers/app.yml اضبط
 db_default_text_search_config: "public.czech"
# أعد البناء

هناك مشكلة أخرى تتعلق بالنقط التشكيلية (diacritics). الطريقة المذكورة أعلاه تقوم بتحميل القاموس دون النقاط التشكيلية، لذا سيعمل مع إعدادات search ignore accents المفعلة. إذا كنت تريد البحث مع النقاط التشكيلية، فيجب عليك تحميل القاموس من https://postgres.cz/data/czech.tar.gz.

أعتقد أن هذه المشكلة تنطبق على لغات أخرى مدعومة افتراضياً في Postgres أيضًا. :confused: إذا قمت بإزالة التشكيل، فأنت في الأساس تعطل المُشتق (stemmer) للغة الخاصة بك للكلمات التي تحتوي على أحرف مشكولة. لذا، ليس من الواضح على الإطلاق ما إذا كان ينبغي تفعيل هذه الميزة لهذه اللغات.

4 إعجابات

@sam هل أنت منفتح على طلب دمج (PR) للموضوع أعلاه؟

بدلاً من ذلك، يمكننا تعديل صورة Docker الأساسية لتشمل المزيد من قواميس البحث الخاصة بـ Postgres افتراضيًا، لكن هذا سيكون أصعب بكثير.