一直想将swish-e的代码分析进行整理,趁着国庆,发布其中的内容,尽快地整理好。用的是swish-e 2.4.7版本。
先对于SWISH-E搜索引擎中的主要数据结构进行介绍。
1. 索引相关的主要数据结构
1.1 SWISH-E定义了SWISH结构对于索引,搜索过程进行处理,其中有MOD_Index结构
struct MOD_Index { /* entry vars */ METAIDTABLE metaIDtable; /*文档中的词条(ENTRY)分析完成后,将它们拷贝到entryArray中进行排序处理*/ ENTRYARRAY *entryArray; /*保存词条的hash表*/ ENTRY *hashentries[VERYBIGHASHSIZE]; char hashentriesdirty[VERYBIGHASHSIZE]; /* just a 0/1 flag */
/* Compression Work buffer while compression locations in index ** proccess */ unsigned char *compression_buffer; int len_compression_buffer; /*worddata保存了在写入索引文件之前,词条位置信息等*/ unsigned char *worddata_buffer; /* Buffer to store worddata */ } |
1.2 词条ENTRY结构
将文档中的内容解析以后,形成单个的词条,然后统计出现的频率、文件、位置等。
Typedef struct ENTRY { struct ENTRY *next; /*出现在文件中的频率*/ int tfrequency; /*词条出现的位置信息*/ LOCATION *currentChunkLocationList; LOCATION *currentlocation; /*信息经过压缩以后,存放到这个链表中*/ LOCATION *allLocatioinList; struct { /*wordID存放了该词条在索引文件中的偏移*/ Sw_off_t wordID; int last_filenum; } /*存放词条的内容,word字符串*/ char word[1]; } ENTRY; |
1.3 词条位置信息LOCATION结构
typedef struct LOCATION { struct LOCATION *next; /*所在的metaID(如果是纯文本,则是1)*/ int metaID; /*所在文件编号*/ int filenum; /*在该文件内词的频率*/ int frequency; /*posdata数组,具体的位置数组*/ unsigned int posdata[1]; } LOCATION; |