удаление дубликатов документов из индексов Zend Lucene - PullRequest
0 голосов
/ 29 января 2011

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

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

вам нужно удалить запись перед ее обновлением, так работает 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 голосов
/ 25 июля 2012

НЕ забывайте совершать $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'));
0 голосов
/ 31 января 2011

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

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

...