/** * Get name for new segment * * @return string */ private function _newSegmentName() { Zend_Search_Lucene_LockManager::obtainWriteLock($this->_directory); $generation = Zend_Search_Lucene::getActualGeneration($this->_directory); $segmentsFile = $this->_directory->getFileObject(Zend_Search_Lucene::getSegmentFileName($generation), false); $segmentsFile->seek(12); // 12 = 4 (int, file format marker) + 8 (long, index version) $segmentNameCounter = $segmentsFile->readInt(); $segmentsFile->seek(12); // 12 = 4 (int, file format marker) + 8 (long, index version) $segmentsFile->writeInt($segmentNameCounter + 1); // Flash output to guarantee that wrong value will not be loaded between unlock and // return (which calls $segmentsFile destructor) $segmentsFile->flush(); Zend_Search_Lucene_LockManager::releaseWriteLock($this->_directory); return '_' . base_convert($segmentNameCounter, 10, 36); }
/** * Оптимизация индекса */ public function optimize() { $zsl = $this->get_index(); $zsl->optimize(); // ВНИМАНИЕ!!! // Код, который следует далее, зависит от версии формата индекса Lucene // и может перестать работать и/или приводить к возникновению ошибок // в будущем при изменении формата, используемого Zend_Search_Lucene! // После некорректного завершения переиндексирования могут остаться "лишние" // файлы: устроим чистку... try { $path = $this->get_index_path(); //$directory = $zsl->getDirectory(); $directory = new Zend_Search_Lucene_Storage_Directory_Filesystem($path); Zend_Search_Lucene_LockManager::obtainWriteLock($directory); $generation = Zend_Search_Lucene::getActualGeneration($directory); $files_to_keep = array("segments.gen", Zend_Search_Lucene_LockManager::WRITE_LOCK_FILE, Zend_Search_Lucene_LockManager::READ_LOCK_FILE, Zend_Search_Lucene_LockManager::READ_LOCK_PROCESSING_LOCK_FILE, Zend_Search_Lucene_LockManager::OPTIMIZATION_LOCK_FILE); if ($generation > 0) { $segments_file_name = Zend_Search_Lucene::getSegmentFileName($generation); $files_to_keep[] = $segments_file_name; $segments_file = $directory->getFileObject($segments_file_name); // после оптимизации должен остаться только один сегмент // найдём имя этого сегмента $segments_file->seek(16); // 4 (int, file format marker) + 8 (long, index version) + 4 (int, segment name counter) $seg_count = $segments_file->readInt(); if ($seg_count == 1) { $seg_name = $segments_file->readString(); $files_to_keep[] = "{$seg_name}.cfs"; $files_to_keep[] = "{$seg_name}.sti"; if ($seg_name && chdir($path)) { $files_to_delete = array_diff(glob("*"), $files_to_keep); foreach ($files_to_delete as $f) { unlink($f); } } } } } catch (Exception $e) { // something went south, probably it was impossible to get the write lock // or read some file // trigger_error(get_class($e) . ": {$e->getMessage()}", E_USER_WARNING); } Zend_Search_Lucene_LockManager::releaseWriteLock($directory); }
/** * Get current generation number * * Returns generation number * 0 means pre-2.1 index format * -1 means there are no segments files. * * @param Zend_Search_Lucene_Storage_Directory $directory * @return integer * @throws Zend_Search_Lucene_Exception */ public static function getActualGeneration(Zend_Search_Lucene_Storage_Directory $directory) { Zend_Search_Lucene::getActualGeneration($directory); }
private function _newSegmentName() { Zend_Search_Lucene_LockManager::obtainWriteLock($this->_directory); $generation = Zend_Search_Lucene::getActualGeneration($this->_directory); $segmentsFile = $this->_directory->getFileObject(Zend_Search_Lucene::getSegmentFileName($generation), false); $segmentsFile->seek(12); $segmentNameCounter = $segmentsFile->readInt(); $segmentsFile->seek(12); $segmentsFile->writeInt($segmentNameCounter + 1); $segmentsFile->flush(); Zend_Search_Lucene_LockManager::releaseWriteLock($this->_directory); return '_' . base_convert($segmentNameCounter, 10, 36); }