从zend lucene索引中删除重复文档

时间:2011-01-29 08:36:56

标签: php lucene indexing duplicates zend-search-lucene

实际上,我创建和优化索引的方法是每次创建和优化一大块记录,而不是一次性转换。现在我面临的问题是我在索引中创建了重复的文档/记录。我需要知道是否有任何函数或代码用于从索引中删除重复项。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

你需要在更新之前删除记录,这是Lucene的工作方式。您无法根据现有记录进行更新。

这是删除记录的方法

$index = Zend_Search_Lucene::open('data/index');//'data/index' is the file that lucene generated
$query = new Zend_Search_Lucene_Search_Query_Term(new
Zend_Search_Lucene_Index_Term($listing_id, 'listing_id'));// 'listing_id' is a field i added when creating index for the first time. $listing_id is the id value of the row i want to delete
$hits = $index->find($query); 
foreach ($hits as $hit) {
    $index->delete($hit->id);// $hit->id is not listing_id, it's lucene unique index of the row that has listing_id = $listing_id
}

现在你可以进行更新,这基本上就是插入:),这就是lucene工作的方式。

答案 1 :(得分:0)

您应该拥有一个唯一标识符的术语。然后,在将文档添加到索引之前,将其删除。

重复只是您拥有多个具有相同唯一ID的文档的实例。因此,您只需枚举唯一ID字段中的所有字词,并搜索具有两个结果的字词。据我所知,没有内置方法可以做到这一点。

答案 2 :(得分:0)

在添加任何新数据之前,请不要忘记提交$index->commit()。这就是我的重复数据在$index->find($query)中返回的原因。

$index = Zend_Search_Lucene::open('/lucene/index');
$query = new Zend_Search_Lucene_Search_Query_Term (new Zend_Search_Lucene_Index_Term($id, 'key'));

$hits = $index->find($query);
foreach ($hits as $hit) {
       $index->delete($hit->id); // $hit->id is not key , it's lucene unique index of the row that has key = $id
}
$index->commit();   // apply changes (delete) before index new data

doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::keyword('key', $id));
$doc->addField(Zend_Search_Lucene_Field::Text('user', $user, 'utf-8'));