Я использую Zend_Search_Lucene для создания индекса статей, который позволяет им искать на моем сайте. Всякий раз, когда администратор обновляет / создает / удаляет статью в области администратора, индекс перестраивается:
$config = Zend_Registry::get("config"); $cache = $config->lucene->cache; $path = $cache . "/articles"; try { $index = Zend_Search_Lucene::open($path); } catch (Zend_Search_Lucene_Exception $e) { $index = Zend_Search_Lucene::create($path); } $model = new Default_Model_Articles(); $select = $model->select(); $articles = $model->fetchAll($select); foreach ($articles as $article) { $doc = new Zend_Search_Lucene_Document(); $doc->addField(Zend_Search_Lucene_Field::Text("title", $article->title)); $index->addDocument($doc); } $index->commit();
Мой вопрос таков. Поскольку я пересматриваю статьи и обрабатываю удаленные статьи, почему бы мне просто не использовать «создавать» каждый раз (вместо «открывать» и обновлять)? Используя вышеуказанный метод, я думаю, что статьи будут добавляться с помощью addDocument каждый раз (так что будут дубликаты). Как я могу это предотвратить? Есть ли способ проверить, существует ли документ в индексе?
Кроме того, я не думаю, что полностью понимаю, как работает индексирование, когда вы «открываете» и обновляете его. Кажется, что каждый раз создавайте новые файлы # .cfs (поэтому у меня есть файлы _0.cfs, _1.cfs, _2.cfs) в папке индекса, но когда я использую «create», он перезаписывает этот файл с новым # .cfs файл с расширением # (так, например, просто _2.cfs). Не могли бы вы объяснить, что такое сегментированные файлы?
Да, вы можете проверить, находится ли документ уже в индексе, посмотрите на этой странице руководства . Затем вы можете удалить этот конкретный документ из индекса через $ index-> delete ($ id) ;, где $ id – возвращаемое значение метода termDocs. После этого вы можете просто добавить новую версию документа.
О нескольких файлов индекса, созданных Lucene: каждый раз, когда вы изменяете существующий индекс, Lucene не меняет существующие файлы, но добавляет частичные индексы для каждого изменения, которое вы делаете. Это очень плохо для производительности, но есть простой способ обойти это. После каждого изменения, которое вы делаете в индекс, выполните следующие действия: $ index-> optimize (); – это добавит все частичные файлы в реальный индекс, что значительно увеличит сроки поиска.