php lucene如何更新和删除索引文件中的行

时间:2011-02-28 14:21:45

标签: php zend-framework search lucene

有时候用户更改帖子的内容,实际数据库中的内容字段会更新。

如何更新索引文件的相同字段?

当用户删除帖子时,如何删除索引文件中的帖子?

1 个答案:

答案 0 :(得分: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);
    }
}

希望它会对你有所帮助;)