2009-09-28 34 views
8

我正在使用Zend_Search_Lucene创建文章索引以允许他们在我的网站上进行搜索。每当管理员更新/创建/删除管理区域中的文章,索引被重建:创建和更新Zend_Search_Lucene索引

$config = Zend_Registry::get("config"); 
$cache = $config->lucene->cache; 
$path = $cache . "/articles"; 

try 
{ 
    $index = Zend_Search_Lucene::open($path); 
} 
catch (Zend_Search_Lucene_Exception $e) 
{ 
    $index = Zend_Search_Lucene::create($path); 
} 

$model = new Default_Model_Articles(); 
$select = $model->select(); 
$articles = $model->fetchAll($select); 

foreach ($articles as $article) 
{ 
    $doc = new Zend_Search_Lucene_Document(); 
    $doc->addField(Zend_Search_Lucene_Field::Text("title", $article->title)); 
    $index->addDocument($doc); 
} 

$index->commit(); 

我的问题是这样的。由于我重新索引文章并处理已删除的文章,为什么我不会每次都使用“创建”(而不是“打开”和更新)?使用上面的方法,我认为文章会每次都添加addDocument(所以会有重复)。我将如何防止?有没有办法检查索引中是否存在Document?

此外,我不认为我完全理解索引在您“打开”和更新时是如何工作的。似乎每次都会在索引文件夹中创建新的#.cfs文件(所以我有_0.cfs,_1.cfs,_2.cfs),但是当我使用“create”时,它会用新的#.cfs覆盖该文件文件以#递增(所以,例如只是_2.cfs)。你能解释一下这些分段文件是什么吗?

回答

8

是的,你可以检查一个文档是否已经在索引中,看看this Manual Page。然后,您可以通过$ index->​​ delete($ id);,从索引中删除此特定文档;其中$ id是termDocs方法的返回值。之后,您可以简单地添加文档的新版本。

关于Lucene创建的多个索引文件:每次修改现有索引时,Lucene都不会实际更改现有文件,而是会为每次更改都添加部分索引。这对性能来说是非常糟糕的,但是解决这个问题的方法很简单。在你对索引做出的每一个改变之后都要这样做:$ index->​​ optimize(); - 这会将所有部分文件附加到真实索引,大大缩短搜索时间。

+0

已售出!非常感谢。 – typeoneerror