php lucene how to update and delete rows in index file
There is time when users change the content of their post, content field in actual database will get updated.
开发者_如何学JAVAhow can I get the same field the index file updated as well?
And when users delete a post how can I delete that post in the index file ?
I used lucene search with Symfony and here is how I use it:
// 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);
}
And here is how I get my index:
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);
}
}
Hope it will help you ;)
精彩评论