我已经看过这个问题了创建和更新Zend_Search_Lucene索引
但是它没能回答我的问题。这篇来自zend的文章告诉我们,更新文档是不可能的。为了有效地更新,必须删除每个文档并重新索引。
$removePath = ...;
$hits = $index->find('path:' . $removePath);
foreach ($hits as $hit) {
$index->delete($hit->id);
}
现在,这对我不起作用。我在$removePath
中给出了索引路径,并尝试了代码。但没有成功。如果我使用与特定索引相关的东西,比如$index->find("title:test");
它会抛出
Fatal error: Exception thrown without a stack frame in Unknown on line 0
我也试过使用
$query = new Zend_Search_Lucene_Search_Query_Term(new Zend_Search_Lucene_Index_Term('test', 'title'));
$hits = $this -> index->find($query);
但它给出了相同的结果。
我甚至不知道如何调试这种类型的错误。即使它被调试了,我也只会得到搜索的项,而不是所有的文档。因此,不会删除所有文档。
谁能告诉我,我做错了什么?如何更新搜索索引?致命错误:抛出异常在第0行
上的未知堆栈帧
意味着你在不能抛出异常的地方抛出了异常。通常,当您试图在php析构函数或php异常处理程序(析构函数和异常处理程序没有stack frame
)中抛出异常时,就会发生这种情况
这个错误消息有点神秘,因为它没有给你提示错误可能在哪里。
然而,这是一个已知的问题:使用索引作为静态属性
所以你应该在索引上调用commit()。它将防止lucene抛出异常:$this->index->commit();
要删除文档,您必须通过索引进行交互并删除每个文档。
$index = Zend_Search_Lucene::open('data/index');
$hits = $index->find('id:'.$id);
foreach ($hits as $hit) {
$index->delete($hit->id);
}
}
因此,使用id或path标识应该与要删除的记录的参数匹配的字段。所有找到的文档都将从索引中删除。
@mrN,下面是一个小脚本来做你所要求的:
// Function will delete all the docs from the given index
function delete_all_docs_from_index(Zend_Search_Lucene_Proxy $index) {
$count = 0;
$indexDocs = $index->maxDoc();// Get the number of non-deleted docs before running this
//print "Num of Docs in the index before deletion " . $indexDocs;
for ($count; $count < $indexDocs; $count++) {
if (!$index->isDeleted($count)) {
$index->delete($count);
$index->commit(); // You have to commit at this point after deleting
}
}
$index->optimize(); // highly recommended
//print "Num of Docs in the index after deletion " . $indexDocs;
return $index;
}
修改你认为合适的函数。
我希望他们的API比现在更友好。
如果有帮助请告诉我。