基础#
倒排中主要是词典和词频位置等信息,倒排索引的设计要考虑两点:压缩和存取性能,在介绍具体的倒排索引前要明晰Lucene中的几个概念
PackedBlock和VIntBlock
固定长度的block(128)和变长的block,在一个PackedBlock中的一定是不同的数据,在VIntBlock中的可以是多种类型的数据-
Postions,payloads和Offsets
position
指的是这个term在doc中的位置
offset
是基于字母的位置
payload
是针对每一个词的一些额外数据,这是一个高级功能,例如:
-
我希望创建一个倒排,希望标识某个term是不是粗体的,那么,可以借助payload中标记,在检索时优先选出
- 希望给每一个doc一个自己的ID,
给每一个doc加一个新的Id:myID,然后添加一个特殊的FieldID和TermID(都相同的ID),每一个文档都包括这个TermID
的包括payload的posting,payload里保存myID,这样我们就能从docId找到myID了。这相当于添加了一个Doc级别的Payload - 通过payload减小倒排大小(时间换空间)
3.SkipData Settings
skipInterval:Lucene是跳跃的步数
词典#
┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
┃ PostingsHeader ┃ TermMetadata ┃
┗━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━┛
│ │
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
│ │
▼ ▼ ┌ ─ ─ ─ ─ ─
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
┃ Header ┃ PackedBlockSize ┃ │
┗━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━┛
▼
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃(DocFPDelta|SingletonDocID)┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
参考文档
1.http://lucene.apache.org/core/5_5_0/core/org/apache/lucene/codecs/lucene50/Lucene50PostingsFormat.html
2.http://www.ibm.com/developerworks/cn/opensource/os-cn-lucene-pl/
3.http://blog.csdn.net/forfuture1978/article/details/4976794