创建和更新Zend_Search_Lucene索引

时间:2009-09-28 00:13:16

标签: php zend-framework lucene 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(所以会有重复)。我该如何防止这种情况?有没有办法检查文档是否已存在于索引中?

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

1 个答案:

答案 0 :(得分:8)

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

关于Lucene创建的多个索引文件:每次修改现有索引时,Lucene都不会真正更改现有文件,但会为每个更改添加部分索引。这对性能来说非常糟糕,但有一种简单的方法可以解决这个问题。在对索引进行的每个更改之后执行以下操作:$ index-> optimize(); - 这会将所有部分文件附加到真实索引,从而大大改善搜索时间。