更新Zend Search Lucene索引的索引文档

时间:2011-04-12 04:38:30

标签: php zend-framework zend-search-lucene

我已经读过这个问题 Creating and updating Zend_Search_Lucene indexes

但它没有回答我的问题。来自zend的This文章指出,无法更新文档。要有效更新,必须删除每个文档并重新编制索引。

$removePath = ...;
$hits = $index->find('path:' . $removePath);
foreach ($hits as $hit) {
    $index->delete($hit->id);
}

现在,这对我不起作用。我在$removePath中给出了索引Path并尝试了代码。它没用。如果我使用相对于我的特定索引的某些内容,例如$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);

但它给出了相同的结果。

我甚至不知道如何调试这种类型的错误。即使它被调试,我只会获取搜索的项目而不是所有文档。因此,所有文件都不会被删除。

任何人都可以告诉我,我做错了什么。如何更新搜索索引?

2 个答案:

答案 0 :(得分:2)

  

致命错误:没有抛出异常   第0行的未知中的堆栈帧

表示您抛出了无法抛出异常的异常。通常,当您尝试在php destructur或php异常处理程序中抛出异常时,会发生这种情况(析构函数和异常处理程序没有stack frame

此错误消息有点神秘,因为它没有提示您可能出现错误的位置。


然而,这是一个众所周知的问题:Using the index as static property

因此,您应该在索引上调用 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,您可以识别与要删除的记录中的参数匹配的字段。找到的所有文档都将从索引中删除。

答案 1 :(得分:1)

@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比目前更友好。

如果有帮助,请告诉我。