سؤال

أنا أبحث عن معلومات حول التعامل مع البحث في ORMs المختلفة.

أقوم حاليًا بإعادة تطوير بعض التطبيقات القديمة في PHP وأحد المتطلبات هو:اجعل كل شيء أو كل شيء تقريبًا قابلاً للبحث، لذلك يقوم المستخدم فقط بكتابة "punkrock Live" ويجد التطبيق مقاطع فيديو أو مقطوعات موسيقية أو مراجعات أو أحداث قادمة أو حتى تعليقات المستخدم المصنفة بهذه الطريقة.

في البيئة التي يكون فيها كل شيء قابلاً للبحث، يحتاج ORM إلى دعم هذه الميزة بطريقتين:

  • توفير بعض واجهات برمجة تطبيقات الفهرسة على الجانب "O" من ORM
  • توفير وسائل لاسترجاع قاعدة البيانات المجمعة على الجانب "R".

الحل المثالي هو إرجاع الكائنات الجاهزة بناءً على السلسلة التي تم البحث عنها.هل تعرف أي حلول شاملة جيدة تؤدي المهمة، وليس بالضرورة في PHP؟إذا تعاملت مع مشكلة مماثلة سيكون من الجيد أن تستمع إلى تجربتك.شيء أكثر من استخدم لوسين أو الويب الدلالي هو الطريق الخط الواحد، مع ذلك ;-)*

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

المحلول

لقد قمت مؤخرًا بدمج بوصلة محرك البحث في تطبيق Java EE 5.تعتمد على لوسين جافا ويدعم أطر عمل ORM المختلفة بالإضافة إلى أنواع أخرى من النماذج مثل XML أو لا يوجد نموذج حقيقي على الإطلاق؛)

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

عندما يتعلق الأمر بالبحث، لديك قوة لوسين في متناول اليد.تمنحك البوصلة بعد ذلك مثيلات لكائنات النموذج كنتيجة بحث.

إنها ليست PHP، لكنك قلت أنه ليس من الضروري أن تكون PHP بالضرورة؛) لا أعرف إذا كان هذا يساعد، رغم ذلك...

نصائح أخرى

في ملف Propel 1.3 schema.xml، يمكنك تحديد أنك تريد أن تقوم جميع نماذجك بتوسيع فئة "BaseModel" التي تقوم بإنشائها.

في هذا BaseModel، ستقوم بإعادة تعريف طريقة save() لتكون شيئًا مثل هذا:

public function save(PropelPDO $con = null)
{
    if($this->getIsSearchable())
    {
             // update your search index here. Lucene, Sphinx, or otherwise
    }

    return parent::save($conn);
}

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

class Search
{
   protected $_searchableTypes = array('music','video','blog');

   public method findAll($search_term)
   {
      $results = array();

      foreach($this->_searchableTypes as $type)
      {
         $results[] = $this->findType($type, $search_term);
      }

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