基礎(chǔ)#
倒排中主要是詞典和詞頻位置等信息槽卫,倒排索引的設(shè)計(jì)要考慮兩點(diǎn):壓縮和存取性能铭若,在介紹具體的倒排索引前要明晰Lucene中的幾個(gè)概念
PackedBlock和VIntBlock
固定長度的block(128)和變長的block,在一個(gè)PackedBlock中的一定是不同的數(shù)據(jù),在VIntBlock中的可以是多種類型的數(shù)據(jù)-
Postions洲炊,payloads和Offsets
position
指的是這個(gè)term在doc中的位置
offset
是基于字母的位置
position & offsets
payload
是針對每一個(gè)詞的一些額外數(shù)據(jù)吨悍,這是一個(gè)高級功能,例如:
-
我希望創(chuàng)建一個(gè)倒排于微,希望標(biāo)識某個(gè)term是不是粗體的逗嫡,那么,可以借助payload中標(biāo)記株依,在檢索時(shí)優(yōu)先選出
payload - 希望給每一個(gè)doc一個(gè)自己的ID驱证,
給每一個(gè)doc加一個(gè)新的Id:myID,然后添加一個(gè)特殊的FieldID和TermID(都相同的ID)恋腕,每一個(gè)文檔都包括這個(gè)TermID
的包括payload的posting抹锄,payload里保存myID,這樣我們就能從docId找到myID了荠藤。這相當(dāng)于添加了一個(gè)Doc級別的Payload - 通過payload減小倒排大小(時(shí)間換空間)
3.SkipData Settings
skipInterval:Lucene是跳躍的步數(shù)
詞典#
┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
┃ 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