您的位置:首页 > 产品设计 > UI/UE

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

2016-08-19 11:01 281 查看
    合并词典和倒排表的源代码和注释

   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)
{
....
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lucene 索引 合并