angry kiwi
angry kiwi

Reputation: 11445

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.

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

Answers (1)

j_freyre
j_freyre

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

Related Questions