يتطابق قاموس المرادفات المتعدد في البحث عن النص الكامل لـ PostgreSQL

StackOverflow https://stackoverflow.com/questions/1208927

سؤال

أحاول إجراء بحث عن النص الكامل في PostgreSQL 8.3.لقد عملت بشكل رائع، لذلك أضفت مطابقة المرادفات (على سبيل المثال:'bob' == 'robert') باستخدام قاموس المرادفات.هذا يعمل بشكل رائع أيضًا.لكنني لاحظت أنه على ما يبدو يسمح فقط بكلمة واحدة واحد مرادف.وهذا يعني أن "al" لا يمكن أن يكون "ألبرت" و"ألين".

هل هذا صحيح؟هل هناك أي طريقة للحصول على مطابقات قاموس متعددة في قاموس مرادفات PostgreSQL؟

كمرجع، إليك نموذج ملف القاموس الخاص بي:

bob    robert
bobby  robert
al     alan
al     albert
al     allen

وSQL الذي ينشئ تكوين البحث عن النص الكامل:

CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname);
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple);
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple;

ما الخطأ الذي افعله؟شكرًا!

هل كانت مفيدة؟

المحلول

هذا قيد في كيفية عمل المرادفات.ما يمكنك فعله هو قلبه كما في:

bob    robert
bobby  robert
alan   al
albert al
allen  al

يجب أن يعطي نفس النتيجة النهائية، وهي أن البحث عن أي منهما سيطابق نفس الشيء.

نصائح أخرى

يجب أن يحدد القاموس علاقة وظيفية بين الكلمات والمعاجم وإلا فلن يعرف الكلمة التي يجب إرجاعها عند المعجم.في المثال الخاص بك، al يعيّن ثلاث قيم مختلفة وبالتالي يحدد دالة متعددة القيم ولا تعرف وظيفة lexize ما يجب إرجاعه.كما يوضح ماغنوس، يمكنك التعجم من أسماء الأعلام alan, albert, allen إلى اللقب al.

ومع ذلك، تذكر أن الهدف من قاموس FTS ليس إجراء تحويلات في حد ذاته ولكن السماح بفهرسة فعالة للكلمات ذات الصلة لغويًا.وهذا يعني أن المعجم لا يحتاج إلى أن يشبه الإدخال الأصلي بأي معنى لغوي.على الرغم من أنك على حق في أنه من المستحيل تحديد علاقة متعدد إلى متعدد، هل تحتاج حقًا إلى ذلك؟على سبيل المثال، لحل مشكلتك vin مثال:

vin        vin
vincent    vin
vincenzo   vin
vinnie     vin

ولكن يمكنك أيضًا القيام بذلك:

vin        grob
vincent    grob
vincenzo   grob
vinnie     grob

والحصول على نفس التأثير (على الرغم من أن سبب رغبتك في ذلك هو قصة أخرى).

وبالتالي، إذا كنت ستقوم بتحليل مستند يحتوي على 11 نسخة من اسم فنسنت، فإن to_tsvector ستعود الوظيفة vin:11 في الحالة السابقة و grob:11 في الأخير.

في وثائق 8.4، يتحدث عن استبدال القاموس المرادف، ربما يكون ذلك مفيدًا؟

http://www.postgresql.org/docs/8.4/interactive/dict-xsyn.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top