0

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 ?

angry kiwi
  • 10,730
  • 26
  • 115
  • 161

1 Answers1

3

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

j_freyre
  • 4,623
  • 2
  • 30
  • 47