2011-02-28 75 views

回答

3

我用Symfony的Lucene搜索,這裏是我如何使用它:

// Called when an object is saved 
public function save(Doctrine_Connection $conn = null) { 
    $conn = $conn ? $conn : $this->getTable()->getConnection(); 
    $conn->beginTransaction(); 
    try { 
     $ret = parent::save($conn); 

     $this->updateLuceneIndex(); 

     $conn->commit(); 

     return $ret; 
    } catch (Exception $e) { 
     $conn->rollBack(); 
     throw $e; 
    } 
} 

public function updateLuceneIndex() { 
    $index = $this->getTable()->getLuceneIndex(); 

    // remove existing entries 
    foreach ($index->find('pk:' . $this->getId()) as $hit) { 
     $index->delete($hit->id); 
    } 

    $doc = new Zend_Search_Lucene_Document(); 

    // store job primary key to identify it in the search results 
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('pk', $this->getId())); 

    // index job fields 
    $doc->addField(Zend_Search_Lucene_Field::unStored('title', Utils::stripAccent($this->getTitle()), 'utf-8')); 
    $doc->addField(Zend_Search_Lucene_Field::unStored('summary', Utils::stripAccent($this->getSummary()), 'utf-8')); 

    // add job to the index 
    $index->addDocument($doc); 
    $index->commit(); 
} 

// Called when an object is deleted 
public function delete(Doctrine_Connection $conn = null) { 
    $index = $this->getTable()->getLuceneIndex(); 

    foreach ($index->find('pk:' . $this->getId()) as $hit) { 
     $index->delete($hit->id); 
    } 

    return parent::delete($conn); 
} 

這裏是我如何得到我的指數:

public static function getInstance() { 
    return Doctrine_Core::getTable('Work'); 
} 

static public function getLuceneIndexFile() { 
    return sfConfig::get('sf_data_dir') . '/indexes/work.' . sfConfig::get('sf_environment') . '.index'; 
} 

static public function getLuceneIndex() { 
    ProjectConfiguration::registerZend(); 

    if (file_exists($index = self::getLuceneIndexFile())) { 

     return Zend_Search_Lucene::open($index); 
    } else { 
     return Zend_Search_Lucene::create($index); 
    } 
} 

希望它會幫助你;)

+0

我對這段代碼有一個小的查詢。你如何在一個未編制索引的字段中使用find()? – CodePorter