/**
  * Merge fields information
  */
 private function _mergeTerms()
 {
     $segmentInfoQueue = new Zend_Search_Lucene_Index_SegmentInfoPriorityQueue();
     $segmentStartId = 0;
     foreach ($this->_segmentInfos as $segName => $segmentInfo) {
         $segmentStartId = $segmentInfo->reset($segmentStartId, true);
         // Skip "empty" segments
         if ($segmentInfo->currentTerm() !== null) {
             $segmentInfoQueue->put($segmentInfo);
         }
     }
     $this->_writer->initializeDictionaryFiles();
     $termDocs = array();
     while (($segmentInfo = $segmentInfoQueue->pop()) !== null) {
         // Merge positions array
         $termDocs += $segmentInfo->currentTermPositions();
         if ($segmentInfoQueue->top() === null || $segmentInfoQueue->top()->currentTerm()->key() != $segmentInfo->currentTerm()->key()) {
             // We got new term
             ksort($termDocs, SORT_NUMERIC);
             // Add term if it's contained in any document
             if (count($termDocs) > 0) {
                 $this->_writer->addTerm($segmentInfo->currentTerm(), $termDocs);
             }
             $termDocs = array();
         }
         $segmentInfo->nextTerm();
         // check, if segment dictionary is finished
         if ($segmentInfo->currentTerm() !== null) {
             // Put segment back into the priority queue
             $segmentInfoQueue->put($segmentInfo);
         }
     }
     $this->_writer->closeDictionaryFiles();
 }
示例#2
0
 /**
  * Merge fields information
  */
 private function _mergeTerms()
 {
     /** Zend_Search_Lucene_Index_TermsPriorityQueue */
     require_once sfConfig::get('sf_lib_dir') . '/modules/search/lib/Lucene/Index/TermsPriorityQueue.php';
     $segmentInfoQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue();
     $segmentStartId = 0;
     foreach ($this->_segmentInfos as $segName => $segmentInfo) {
         $segmentStartId = $segmentInfo->resetTermsStream($segmentStartId, Zend_Search_Lucene_Index_SegmentInfo::SM_MERGE_INFO);
         // Skip "empty" segments
         if ($segmentInfo->currentTerm() !== null) {
             $segmentInfoQueue->put($segmentInfo);
         }
     }
     $this->_writer->initializeDictionaryFiles();
     $termDocs = array();
     while (($segmentInfo = $segmentInfoQueue->pop()) !== null) {
         // Merge positions array
         $termDocs += $segmentInfo->currentTermPositions();
         if ($segmentInfoQueue->top() === null || $segmentInfoQueue->top()->currentTerm()->key() != $segmentInfo->currentTerm()->key()) {
             // We got new term
             ksort($termDocs, SORT_NUMERIC);
             // Add term if it's contained in any document
             if (count($termDocs) > 0) {
                 $this->_writer->addTerm($segmentInfo->currentTerm(), $termDocs);
             }
             $termDocs = array();
         }
         $segmentInfo->nextTerm();
         // check, if segment dictionary is finished
         if ($segmentInfo->currentTerm() !== null) {
             // Put segment back into the priority queue
             $segmentInfoQueue->put($segmentInfo);
         }
     }
     $this->_writer->closeDictionaryFiles();
 }