Question

Je suis assez nouveau à la programmation et certainement à l'indexation Zend / Lucene. D'après ce que je peux dire, cependant, mon code est correct. Je sens que je peux être méconnais une étape ou quelque chose d'essayer de télécharger les modifications et ajoute à la base de données afin qu'ils apparaissent dans la recherche sur mon site. Je ne reçois aucune sorte d'un message d'erreur si. Voici le code du contrôleur. Je suppose que laissez-moi savoir si vous avez besoin d'autre chose pour aider ce sens de faire. Merci à l'avance pour toute direction que vous pouvez donner.

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

}

Était-ce utile?

La solution

index Lucene ne restera pas en phase avec votre base de données automatiquement, vous devez soit de reconstruire l'index entier ou supprimer et ajouter de nouveau les documents pertinents lorsqu'ils changent (vous ne pouvez pas modifier un document existant).

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

}

Notez que les documents Lucene avaient leur propre propriété id interne, et veillez à ne pas le confondre avec un mot-clé identifiant que vous fournissez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top