Обновление проиндексированных документов индексов Zend Search Lucene

Я уже прочитал этот вопрос Создание и обновление индексов 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);

Но результат был тот же.

Я даже не знаю, как отлаживать такой тип ошибок. И даже если он будет отлажен, я получу только найденные элементы, а не все документы. Итак, не все документы удаляются.

Может кто-нибудь подскажите, что я делаю не так. Как обновить поисковые индексы?


person mrN    schedule 12.04.2011    source источник
comment
не могли бы вы опубликовать часть, где индекс открыт?   -  person opHASnoNAME    schedule 12.04.2011


Ответы (2)


Неустранимая ошибка: исключение создано без кадра стека в Неизвестном в строке 0

Означает, что вы создали исключение, при котором исключение не может быть создано. Обычно это происходит, когда вы пытаетесь сгенерировать исключение в деструктуре php или обработчике исключений php (деструкторы и обработчики исключений не имеют stack frame)

Это сообщение об ошибке выглядит загадочно, потому что не дает подсказок, где может быть ошибка.


Однако это известная проблема: Использование индекса как статическое свойство

Поэтому вы должны вызвать commit () в своем index. Это предотвратит генерацию исключения lucene:

$this->index->commit();

Чтобы удалить документы, вы должны пройти через индекс и удалить каждый документ.

$index = Zend_Search_Lucene::open('data/index');

$hits = $index->find('id:'.$id);

  foreach ($hits as $hit) {
     $index->delete($hit->id);
  }
}

Таким образом, с помощью идентификатора или пути вы определяете поле, которое должно соответствовать параметру из записи, которую вы хотите удалить. Все найденные документы будут удалены из индекса.

person Upvote    schedule 12.04.2011
comment
Спасибо за решение моей ошибки. Тем не менее, мой настоящий вопрос остается без ответа. Как удалить все документы в индексе? - person mrN; 12.04.2011
comment
Я уже нашел похожие коды, но как $id будут нацелены на все документы. Насколько я знаю, он нацелен только на те, которые соответствуют полю $ id, is id. - person mrN; 13.04.2011
comment
Если id - это уникальный ключ для идентификации документа, он соответствует вашей записи 1: 1 - person Upvote; 13.04.2011
comment
Собственно, как найти все документы и удалить их. - person mrN; 13.04.2011
comment
Как вы их индексируете? Так же, как вы их удаляете, переберите каждый элемент - person Upvote; 13.04.2011
comment
Итак, нет возможности удалить их, используя что-то вроде * - person mrN; 17.04.2011
comment
Нет. Разве это не просто и понятно? Так же, как вы индексируете свои данные, например читая базу данных, вы удаляете все. Получите все записи базы данных, которые вы проиндексировали, пропустите их и используйте приведенный выше код, чтобы удалить их по идентификатору. - person Upvote; 17.04.2011

@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 был более дружелюбным, чем сейчас.

Сообщите мне, если это поможет.

person jpMig    schedule 19.09.2014