Example #1
0
 /**
  * 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);
 }
Example #2
0
 /**
  * Оптимизация индекса
  */
 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);
 }
Example #3
0
 /**
  * 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);
 }
Example #4
0
 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);
 }