2、倒排索引的數(shù)據(jù)結(jié)構(gòu)
倒排索引其實(shí)包含了三種數(shù)據(jù),分別是
- 倒排表(Posting List)
- 詞項(xiàng)字典(Term Dictionary)
- 詞項(xiàng)索引(Term Index)
這幾種文件分別存儲(chǔ)了不同的數(shù)據(jù)
其中倒排表包含某個(gè)詞項(xiàng)的所有id的數(shù)據(jù)存儲(chǔ)了在.doc文件中;
詞項(xiàng)字典包含了index field的所有經(jīng)過(guò)normalization token filters處理之后的詞項(xiàng)數(shù)據(jù),最終存儲(chǔ)在.tim文件中。
所謂normalization其實(shí)是一個(gè)如去重、時(shí)態(tài)統(tǒng)一、大小寫統(tǒng)一、近義詞處理等類似的相關(guān)操作;詞項(xiàng)索引就是為了加速詞項(xiàng)字典檢索的一種數(shù)據(jù)結(jié)構(gòu),落地文件為.tip。.tip文件和.tim文件的數(shù)據(jù)結(jié)構(gòu)如下圖所示:
?Lucene中通過(guò)FST Index信息來(lái)讀取當(dāng)前域在索引文件.tim的具體信息,而同一個(gè)索引所有域的FSTIndex都被連續(xù)的寫入在同一個(gè).tip文件中,所以就需要indexStartFP 來(lái)索引 FSTIndex。
FSTIndex底層是一個(gè)字節(jié)數(shù)組,存儲(chǔ)了每個(gè)Block在.tim中的起始位置,如上圖所示,Block f和Block g對(duì)應(yīng)的Block分別被保存在了.tim文件的Block 0和Block 1的位置。
每個(gè)Block內(nèi)部又保存了Block Header、Suffix和Stats信息以及Metadatas信息,其中Block Header中存儲(chǔ)了當(dāng)前Block中的Pending Block和Pending Term的總計(jì)數(shù),也就是EntryCount,Sufix則是保存了當(dāng)前Block后綴的個(gè)數(shù)以及分別是什么,如block b的SufixLength=2,為f、g。Stats則保存了當(dāng)前Term的詞頻和文檔頻率,參見(jiàn)org.apache.lucene.index.TermsEnum.TermStats。
其中docFreq為包含當(dāng)前Term的doc數(shù)量,totalTermFreq為當(dāng)前term在所有文檔中的當(dāng)前字段中出現(xiàn)的總次數(shù),但實(shí)際保存的是和docFreq的差值,這也是遵循通用最小化算法的法則表現(xiàn)。需要注意的是,兩者均是指在同一個(gè)域內(nèi)的計(jì)數(shù)。Metadatas這里不著重介紹。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-415866.html
關(guān)于倒排表的文件結(jié)構(gòu),我們僅需知道其內(nèi)部存儲(chǔ)了包含Term的id數(shù)組、詞頻、postion、payload、offset等信息,需要重點(diǎn)注意的是ES內(nèi)部采用怎樣的壓縮算法。這一點(diǎn)在下一節(jié)內(nèi)容展開來(lái)講。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-415866.html
到了這里,關(guān)于倒排索引的數(shù)據(jù)結(jié)構(gòu):Term index、Term Dictionary、Posting List的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!