/** * 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(); }
/** * 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(); }