您的位置:首页 > 其它

terrier索引结构

2017-09-20 09:29 106 查看
Terrier检索平台对文档集索引后主要生成了四种索引文件,即文档索引直接索引词典倒排索引,下面分别介绍这四种索引的格式。

下图是我对索引文件数据结构的总结:



文档索引(DocumentIndex)

文档索引保存在data.document.fsarrayfile文件中,存储了每个文档的信息,包括文档长度(docLength)、条目数(numEntries)和 指向相应直接索引 的指针。

指向直接索引的指针有两个属性,即字节偏移(byteOffset)和位偏移(bitOffset)。通过直接索引文件的字节偏移和位偏移即可直接访问到直接索引中该文档的信息。其中文档长度(docLength)即为文档中所有词项(term)个数(包括重复出现的),条目数(numEntries)即为文档中出现的唯一词项(uniqueTerm)个数(不包括重复出现的),对应于在直接索引中此文档的条目个数。

下为文档索引中一个索引条目的格式:

docLength(4)byteOffset(8)bitOffset(1)numEntries(4)
一个索引条目的大小为4+8+1+4=17字节,一个文档对应一个文档索引条目。

直接索引(DirectIndex)

直接索引保存在data.direct.bf文件中,存储了在每个文档中出现的词项ID和该词项出现在该文档的频率,每个文档对应n条记录,n表示该文档中出现了的单独词项(term)个数。每一个索引条目包括了词项ID(TermID)、词频(TF),还有可能包含在文档中出现位置信息以便于邻近查询和词组查询,这里讨论无位置信息的情况。特别注意,直接索引必须通过文档索引的时针才可以访问。

下图为直接索引中索引条目的格式:

TermID(Gamma编码)TermFrequence(Unary编码)TF+1(Unary编码)…… Position(TF个Gamma编码)
通过特定的解码函数即可将索引读取。关于Gamma和Unary编码方式请查看相关文献,本文不作讲解。特别注意,TermID和Position保存的是和上一条记录的差值,并非原始数据

词典(Lexicon)

词典信息保存在data.lexicon.fsomapfile文件中,词典顾名思义,即保存了文档集中各个词项的信息。它存储了键值(Key)即该词项的文本形式、每个词项(term)出现在文档集的频率的统计(TF)、词项ID(TermID)以及出现在不同文档的次数(Nt)。还有,为了便于检索,保存了一个指针指向倒排索引相应的记录列表,指针包括了字节偏移(ByteOffset)和位偏移(BitOffset)两个属性。

下图为词典中每个词典条目的格式

Key(61)TermID(4)TF(4)Nt(4)ByteOffset(8)BitOffset(1)BlockCount(4)
一个词典条目的大小为61+4+4+4+8+1+4=86字节,一个词项对应一个词典条目(LexiconEntry)。

倒排索引(InvertedIndex)

倒排索引保存在data.inverted.bf文件中,存储了每一个词项的记录列表,记录包括词项出现的文档ID(DocID),出现在该文档的次数(TF)。随意地,记录列表也可以包含词项出现在文档的位置或者域。位置信息使得短语和邻近搜索得以实现,本文讨论不保存位置信息和域信息的情况,在倒排索引里文档ID(DocID)用Gamma编码方式编码。词项频率使用Unary编码方式编码,并且如果词项位置被记录则使用Gamma编码。特别注意,倒排索引必须通过词典的指针才可访问。

下为倒排索引中每个索引条目的格式

DocID(Gamma编码)TermFrequence(Unary编码)TF+1(Unary编码)…… Position(TF个Gamma编码)
一个词项有n个索引条目(Entry),n为该词项在文档集中出现的文档频率(Nt)。特别注意,DocID和Position保存的是和上一条记录的差值,并非原始数据。

元数据(metaIndex)

元数据索引信息保存在data.meta.idx和data.meta.zdata文件中,主要保存了文档的描述信息,如文档名,文档ID等。data.meta.idx文件保存的是data.meta.zdata的指针,一个文档在data.meta.idx中对应一条记录,该记录只有一条信息,即某文档在data.meta.zdata文件中的偏移(long类型8字节),访问时直接将此文件读入内存放入数组中。data.meta.zdata文件是被压缩的文件,保存了压缩后的元数据信息。

解压后的一条元数据记录格式如下:

DocID(79)filename(6147)
一条记录是79+6147=6226字节。读取原数据时,首先将data.meta.idx读入内存以获得某一文档原数据指针,再通过获得元数据指针和下一文档元数据指针的差值得到记录长度,再在data.meta.zdata文件中指针位置读取该项记录长度的元数据记录,再通过解压器将字节流解压缩为6226字节的字节流,即获得了一条完整的元数据记录。如要获取DocID则只需读前79个字节,如要获取filename则只需要从第80字节开始往后读6147个字节.

Part Learn from喜阿尼古的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  terrier index 索引结构