2011-01-29 2 views
0

На самом деле мой способ создания и оптимизации индексов состоит в том, что я каждый раз создаю и оптимизирую кусок записей, а не конвертируем все за один раз. Теперь проблема, с которой я столкнулся, заключается в том, что я получаю дубликаты документов/записей, созданных в индексе. Мне нужно знать, есть ли какая-либо функция или код для удаления дубликатов из индекса. благодарит заранее.удаление дубликатов документов из zend lucene indexes

ответ

0

У вас должен быть термин, который является уникальным идентификатором. Затем перед добавлением документа в индекс вы удаляете его.

Дубликаты - это просто экземпляры, в которых у вас есть несколько документов с тем же уникальным идентификатором. Поэтому вы просто перечислите все термины в своем уникальном поле id и выполните поиск тех, у которых есть два результата. Насколько я знаю, для этого не существует встроенного метода.

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 работы.

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')); 
Смежные вопросы