سؤال

لدي تطبيق لإدارة الممتلكات مكون من جداول:

tenants
landlords
units
properties
vendors-contacts

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

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

باستخدام PostgreSQL

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

المحلول

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

إذا كنت تريد تنفيذ ذلك في قاعدة البيانات، فقد يعمل شيء مثل المخطط التالي، على افتراض أنك تستخدم مفاتيح بديلة:

  1. لكل جدول قابل للبحث، قم بإنشاء طريقة عرض تحتوي على عمود المفتاح الأساسي لهذا الجدول واسم الجدول وسلسلة من كافة الحقول القابلة للبحث في هذا الجدول.
  2. قم بإنشاء فهرس GIN أو GiST وظيفي على الجزء الأساسي عبر to_tsvector() من نفس التسلسل بالضبط.
  3. قم بإنشاء UNION ALL على كافة طرق العرض لإنشاء طريقة عرض قابلة للبحث.

بعد ذلك يمكنك إجراء عمليات البحث مثل هذا:

SELECT id, table_name, ts_rank_cd(body, query) AS rank
    FROM search_view, to_tsquery('search&words') query
    WHERE query @@ body
    ORDER BY rank DESC
    LIMIT 10;

نصائح أخرى

لماذا لا ننشئ الرأي الذي هو اتحاد من الجداول التي تجمع الأعمدة التي تريد البحث عن واحد، ومن ثم البحث في هذا العمود مجمعة؟

هل يمكن أن تفعل شيئا من هذا القبيل:

select 'tenants:' + ltrim(str(t.Id)), <shared fields> from Tenants as t union
select 'landlords:' + ltrim(str(l.Id)), <shared fields> from Tenants as l union
...

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

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

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

وأيضا، لا ننسى أن المؤشرات العادية لا يمكن أن تستخدم لsomething LIKE '%...%'. وسوف تستخدم محرك بحث النص الكامل تكون قادرة على القيام تفتيش فرعية فعالة أيضا.

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

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