拆解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)
{
....
}
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)
{
....
}
相关文章推荐
- 拆解Cluene系列(10)——详解索引的合并(一)
- 拆解Cluene系列(12)——创建索引生成的文件格式和内容
- 拆解Cluene系列(9)——建立索引用到的类关系
- 拆解Cluene系列(8)——建立索引的流程
- 拆解Cluene系列(4)——store中的类图
- 数据库设计系列11--选择文件组织方式和索引 推荐
- 数据结构和算法系列11 五大查找之索引查找
- 拆解Cluene系列(7)——Cluene用到的虚继承
- 拆解Cluene系列(22)——Query的再解释
- 小酌重构系列[11]——提取基类、提取子类、合并子类
- 拆解Cluene系列(5)——Analyzers中的类图
- Lucene系列 - 索引(八) - 对索引进行优化与合并
- Direct3D 11系列文章索引
- 拆解Cluene系列(13)——Query和weight类图
- 数据结构和算法系列11 五大查找之索引查找
- 拆解Cluene系列(6)——Analyzer的职责链模式
- 拆解Cluene系列(14)——搜索时序图
- 分区表及分区索引(11)--合并表分区
- Java相关文章索引(11)
- Step by Step-构建自己的ORM系列-索引