Обновление индексированных документов индексов Zend Search Lucene - PullRequest
1 голос
/ 12 апреля 2011

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

Но это дало тот же результат.

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

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

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

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

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

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


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

Таким образом, вы должны вызвать 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);
  }
}

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

1 голос
/ 19 сентября 2014

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

Дайте мне знать, если это поможет.

...