سؤال

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

class SearchController extends Zend_Controller_Action
{

  public function init()
  {
    $auth = Zend_Auth::getInstance();

    if($auth->hasIdentity()) {
      $this->view->identity = $auth->getIdentity(); 
    }
 }

 public function indexAction()
 {
    // action body
 }

 public function buildAction()
 {
    // create the index
    $index = Zend_Search_Lucene::open(APPLICATION_PATH . '/indexes');
    $page = $this->_request->getParam('page');

    // build product pages
     if ($page == 'search') {
       $mdl = new Model_Search();
       $search = $mdl->fetchAll();
       if ($search->count() > 0) {
       foreach ($search as $s) {
         $doc = new Zend_Search_Lucene_Document();
         $doc->addField(Zend_Search_Lucene_Field::unIndexed('id', $s->id));
         $doc->addField(Zend_Search_Lucene_Field::text('name', $s->name));
         $doc->addField(Zend_Search_Lucene_Field::text('uri', $s->uri));
         $doc->addField(Zend_Search_Lucene_Field::text('description', $s->description));
         $index->addDocument($doc);
        }
       }
       $index->optimize();
       $this->view->indexSize = $index->numDocs();
  } 
 }

  public function resultsAction()
  {
    if($this->_request->isPost()) {
    $keywords = $this->_request->getParam('query');
    $query = Zend_Search_Lucene_Search_QueryParser::parse($keywords);
    $index = Zend_Search_Lucene::open(APPLICATION_PATH . '/indexes');
    $hits = $index->find($query);
    $this->view->results = $hits;
    $this->view->keywords = $keywords;
  } else {
    $this->view->results = null;
  }
}

}

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

المحلول

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

public function updateAction()
{
   // something made the db change
   $hits = $index->find("name: " . $name);
   foreach($hits as $hit) {
     $index->delete($hit->id)  
   }

   $doc = new Zend_Search_Lucene_Document();
   // build your doc

   $index->add($doc);

}

لاحظ أن مستندات Lucene لديها خاصية معرّف داخلية خاصة بها ، واحرص على عدم الخطأ في كلمة رئيسية معرف تقدمها.

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