Reputation: 11445
There is time when users change the content of their post, content field in actual database will get updated.
how 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 ?
Upvotes: 0
Views: 2653
Reputation: 4738
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 ;)
Upvotes: 3