关系数据库 CoDB 中 XML 全文检索的设计与实现
5.1 索引的存储
我们使用和数据库存储分离的方式来保存全文检索.我们使用文件系统将索引的结果按词作
为文件名来存储,假设索引目录为%
INDEX%.我们对于中英文的分词处理也不同.对于中文按字索引所以不需要字典,英文单词
之间由于有空格分开可以很容易的分词.中
文索引文件名为十 6 进制的编码.例如"大"字对应的索引文件为 00F3B4H.英文单词的索引文
件较简单,例如单词 word 对应的索引文件为
%INDEX%/word.我们设置了最大词长度 MAX_WORD_LENGTH,当词的实际长度超过此长
度时,该词被忽略.自索引文件我们使用%
INDEX%/word_idx 作为文件名来存储.
文件中的每条记录的结构如下:TID ElementOffset OffsetToElement DeweyId
其中 TID 可以唯 1 的标记文档, ElementOffset 为该词所在的 XML 节点的起始位置(按字
节),OffsetToElement 为该词相对于该 XML 节点
的 偏 移 量 ( 按 字 节 ). 该 词 在 文 档 中 的 实 际 出 现 位 置 ( 按 字 节 ) 为 ElementOffset +
OffsetToElement.DeweyId 为所在节点在 XML 文档中的
DeweyId.DeweyId 可以参看 XML 的编码 1 节.
为提高建立索引的速度,我们在写索引文件的时候使用 Cache 技术.建立索引时使用 Cache 和
不使用 Cache 速度上可以差十倍之多.目前
Cache 块数为 16k,每块大小为 8k,每块 Cache 对应 1 个词.
Xfti 为 Cache 的 结 构 体 , 整 个 过 程 中 只 使 用 1 个 , 由 CreateXftiIndex 函 数 生 成 , 由
CloseXftiIndex 函数释放.该结构体其中包含索引目录
cDir,1 个 Cache 结构体数组 pCache 和 1 个指向 Cache 数组的指针数组.该数组用于对 Cache
按词序排序,以便 2 分法查找.iCacheCount 为使
用中的 Cache 块个数(总是出现在前面).其中每个 Cache 块的结构体包括:Cache 内容开始偏
移量 iStart(之前为该词)及结束偏移量
iEnd,以及块 cBuf(前面存储词,后面是 Cache 内容,如 cBuf="secret 2 3 4 5 6 ", iStart=7,
iEnd=19).
结构体 find_data 为 parse 出的结果信息.其中 cWord 为结果单词,pText 指向当前文档 iLength
为该词长度,iOffset 为当前单词在 XML 节
点中的相对偏移量,iPositoin 为词序,iPathLength 为当前 DeweyId 的长度,数组 iPath 为当前
DeweyId,数组 iStartOffset 为当前