拆解Cluene系列(11)——索引的合并(二)

    合并词典和倒排表的源代码和注释

  

void SegmentMerger::mergeTermInfos(SegmentMergeQueue* queue)
{
	
	//base is the id of the first document in a segment
	int32_t base = 0;

	IndexReader* reader = NULL;
	SegmentMergeInfo* smi = NULL;
    //0.准备工作,初始化每个seg的枚举器,使之指向seg的第一个term,构建SegmentMergeInfo信息(这时,修改了doc Id编号),压入队列.

	for (uint32_t i = 0; i < readers.size(); i++) {

		reader = readers[i];

		TermEnum* termEnum = reader->terms();
		smi = _CLNEW SegmentMergeInfo(base, termEnum, reader);
		base += reader->numDocs();
		if (smi->next()){
			queue->put(smi);
		}else{
			smi->close();
			_CLDELETE(smi);
		}
	}

	
	SegmentMergeInfo** match = _CL_NEWARRAY(SegmentMergeInfo*,readers.size()+1);
	SegmentMergeInfo* top = NULL;

	//As long as there are SegmentMergeInfo instances stored in the queue
	while (queue->size() > 0) {
		int32_t matchSize = 0;			  

		
		//1.从优先级队列中弹出第一个Term放到match数组中。
		match[matchSize++] = queue->pop();
		
		Term* term = match[0]->term;
		top = queue->top();
		//2.寻找含有相同Term的其他seg也放到match数组中
		while (top != NULL && term->equals(top->term) ){ 
			match[matchSize++] = queue->pop();
			top = queue->top();
		}
		match[matchSize]=NULL;

		//3.合并这些相同Term的倒排表,并把新的倒排表加入新生成的seg中。
		mergeTermInfo(match); //matchSize 处理这个Term

		//4.将match数组中还有Term的seg重新放入优先级队列中.
		while (matchSize > 0){
			smi = match[--matchSize];
			if (smi->next()){
				queue->put(smi);
			}else{
				_CLDELETE( smi );
			}
		}
	   //5.继续检测队列,重复上述过程,直到队列元素为空。
	}

	_CLDELETE_ARRAY(match);
}


void SegmentMerger::mergeTermInfo( SegmentMergeInfo** smis)
{
	....
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值