public function testMerge() { $segmentsDirectory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_files/_source'); $outputDirectory = new Zend_Search_Lucene_Storage_Directory_Filesystem(dirname(__FILE__) . '/_files'); $segmentsList = array('_0', '_1', '_2', '_3', '_4'); $segmentMerger = new Zend_Search_Lucene_Index_SegmentMerger($outputDirectory, 'mergedSegment'); foreach ($segmentsList as $segmentName) { $segmentMerger->addSource(new Zend_Search_Lucene_Index_SegmentInfo($segmentName, 2, $segmentsDirectory)); } $mergedSegment = $segmentMerger->merge(); $this->assertTrue($mergedSegment instanceof Zend_Search_Lucene_Index_SegmentInfo); unset($mergedSegment); $mergedFile = $outputDirectory->getFileObject('mergedSegment.cfs'); $mergedFileData = $mergedFile->readBytes($outputDirectory->fileLength('mergedSegment.cfs')); $sampleFile = $outputDirectory->getFileObject('mergedSegment.cfs.sample'); $sampleFileData = $sampleFile->readBytes($outputDirectory->fileLength('mergedSegment.cfs.sample')); $this->assertEquals($mergedFileData, $sampleFileData); $outputDirectory->deleteFile('mergedSegment.cfs'); }
/** * Merge specified segments * * $segments is an array of SegmentInfo objects * * @param array $segments */ private function _mergeSegments($segments) { $newName = $this->_newSegmentName(); /** Zend_Search_Lucene_Index_SegmentMerger */ require_once 'Zend/Search/Lucene/Index/SegmentMerger.php'; $merger = new Zend_Search_Lucene_Index_SegmentMerger($this->_directory, $newName); foreach ($segments as $segmentInfo) { $merger->addSource($segmentInfo); $this->_segmentsToDelete[$segmentInfo->getName()] = $segmentInfo->getName(); } $newSegment = $merger->merge(); if ($newSegment !== null) { $this->_newSegments[$newSegment->getName()] = $newSegment; } $this->commit(); }
/** * Merge specified segments * * $segments is an array of SegmentInfo objects * * @param array $segments */ private function _mergeSegments($segments) { // Try to get exclusive non-blocking lock to the 'index.optimization.lock' // Skip optimization if it's performed by other process right now $optimizationLock = $this->_directory->createFile('index.optimization.lock'); if (!$optimizationLock->lock(LOCK_EX, true)) { return; } $newName = $this->_newSegmentName(); $merger = new Zend_Search_Lucene_Index_SegmentMerger($this->_directory, $newName); foreach ($segments as $segmentInfo) { $merger->addSource($segmentInfo); $this->_segmentsToDelete[$segmentInfo->getName()] = $segmentInfo->getName(); } $newSegment = $merger->merge(); if ($newSegment !== null) { $this->_newSegments[$newSegment->getName()] = $newSegment; } $this->commit(); // optimization is finished $optimizationLock->unlock(); }