php - 创建和更新 Zend_Search_Lucene 索引

标签 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)文件,但是当我使用“创建”时,它会用新的#.cfs 覆盖该文件# 递增的文件(因此,例如只是_2.cfs)。你能解释一下这些分段文件是什么吗?

最佳答案

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

关于Lucene创建的多个索引文件: 每次修改已有的索引,Lucene并不真正改变已有的文件,而是为每一次修改添加部分索引。这对性能非常不利,但有一种简单的方法可以解决这个问题。在对索引进行每次更改后,请执行以下操作: $index->​​optimize(); - 这会将所有部分文件附加到真实索引,从而显着缩短搜索时间。

关于php - 创建和更新 Zend_Search_Lucene 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1484876/

相关文章:

php - 升级到 PHP 5.3.19 后子进程 pid 退出信号段错误 (11)

php - 如何编辑 Paypal 沙箱的输入字段?

php - 使用 Zend Framework 应用程序将 subview 加载到 IFrame 中

java - Hibernate Search 空间构面查询首先运行 5 次,然后仅返回第 5 个结果

python - 如何将搜索字符串与Python中的内容相匹配

php - 如何跨域跟踪用户购买

php - 插入数据时 if 语句无法正常工作

php - 如何在 Zend_Form 中添加 '[]' 到表单元素名称?

zend-framework - Zend框架如何获取当前登录的用户详细信息

java - 我将如何使用 Lucene 为客户建立索引