基礎#
倒排中主要是詞典和詞頻位置等信息,倒排索引的設計要考慮兩點:壓縮和存取性能,在介紹具體的倒排索引前要明晰Lucene中的幾個概念
PackedBlock和VIntBlock
固定長度的block(128)和變長的block,在一個PackedBlock中的一定是不同的數據,在VIntBlock中的可以是多種類型的數據-
Postions,payloads和Offsets
position
指的是這個term在doc中的位置
offset
是基于字母的位置
position & offsets
payload
是針對每一個詞的一些額外數據,這是一個高級功能,例如:
-
我希望創建一個倒排,希望標識某個term是不是粗體的,那么,可以借助payload中標記,在檢索時優先選出
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