Frage

Ich bin ziemlich neu in der Programmierung und auf jeden Fall zu Zend / Lucene Indexierung. Von dem, was ich sagen kann, aber ist mein Code korrekt. Ich fühle mich wie ich einen Schritt seinen Blick oder etwas versuchen, Änderungen zu laden und fügt zu der Datenbank, so dass sie bei der Suche auf meiner Website erscheinen. Warum bekomme ich nicht jede Art von einer Fehlermeldung though. Unten ist der Code von der Steuerung. Ich denke, lassen Sie mich wissen, wenn Sie noch etwas die sinnvoll zu helfen. Vielen Dank im Voraus für jede Richtung geben kann.

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;
  }
}

}

War es hilfreich?

Lösung

Lucene-Indizes werden nicht automatisch synchron mit der Datenbank bleiben, benötigen Sie entweder den gesamten Index oder zu entfernen und erneut hinzufügen die entsprechenden Dokumente neu zu erstellen, wenn sie sich ändern (Sie können nicht bearbeiten ein vorhandenes Dokument).

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);

}

Beachten Sie, dass lucene Dokumente ihre eigene interne ID-Eigenschaft hatten, und darauf achtet, nicht es für ein id Schlüsselwort verkennen, dass Sie zur Verfügung stellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top