swish-e搜索引擎,代码分析(8)

2.5.4 coalesce_word_locations函数分析

coalesce_word_locations函数对于LOCATION的信息进行了合并,将同一个metaID的信息都放在

了一个LOCATION中,不同的filenum,只是存放了差值。在index.c L 2847开始,循环遍历每个

LOCATION,进行词条信息的合并。

/* Run on all locations */ for(loc = e->currentChunkLocationList; loc; ) { p = (unsigned char *) loc; /* get next LOCATION in linked list*/ next = * (LOCATION **) loc; p += sizeof(LOCATION *); /* get metaID of LOCATION */ metaID = uncompress2(&p); /* Check for new metaID */ if(metaID != curmetaID) { /*此时的metaID为1,纯文本方式,而curmetaID = 0, 暂时跳过这个if语句*/ /*在第一次处理的时候,buffer中的信息为: <metaID><sizeof data><filenum><position info>,然后跳转进入处理 下一个LOCATION,假设此时为不为1。进入下面的if语句*/ /* If exits previous data add it to the linked list */ if(curmetaID) { /*此时的tmp记录了上一个metaID中存储filenum,position信息等的长度*/ /* add to the linked list and reset values */ /* Update the size of chunk's data in *size_p */ tmp = q - (size_p + sizeof(unsigned int)); /*填写上一个metaID的信息长度*/ /* Write the size */ memcpy(size_p, (char *)&tmp, sizeof(tmp) ); /* Add to the linked list keeping the data sorted by metaname, filenum */ /* Allocate memory space */ coalesced_buffer = (unsigned char *)Mem_ZoneAlloc(sw->Index->totalLocZone,q-buffer); /*此时的coalesced_buffer为<metaID><信息长度><filenum词条信息等>*/ /* Copy content to it */ memcpy(coalesced_buffer,buffer,q-buffer); /*将这个metaID信息写入到allLOCATION中, 就是将原先的allLocationList进行了替代, 生成了一个metaID对应一个LOCATION的链表*/ /* Add to the linked list */ add_coalesced(sw, e, coalesced_buffer, q - buffer, curmetaID); } /* Reset values */ curfilenum = 0; curmetaID = metaID; q = buffer + sizeof(void *); /* Make room for linked list pointer */ q = compress3(metaID,q); /* Add metaID */ /*从这个位置开始记录了一个LOCATION的其它信息*/ size_p = q; /* Preserve position for size */ q += sizeof(unsigned int); /* Make room for size */ num_locs = 0; } /*如果取得的下一个metaID相同,则直接将filenum等信息写入到buffer中*/ /*将filenum,频率等信息解压出来*/ uncompress_location_values(&p,&uflag,&filenum,&frequency); worst_case_size = sizeof(unsigned char *) + (3 + frequency) * MAXINTCOMPSIZE;

通过以上的处理,e->allLocationList中,存放了按照metaID进行排序的LOCATION结构链表。

而LOCATION中的结构为:

-----------------------------------------------------------------------

| 下一个LOCATION | metaID | 词条信息的size| 词条信息  |

| 的指针                 |              |                       |                |

-----------------------------------------------------------------------

对于词条信息等压缩完成以后,下面开始写入到索引文件中。 

 

你可能感兴趣的:(swish-e搜索引擎,代码分析(8))