學習lucene索引文件格式的目的是通過對lucene數據結構的理解,從而為lucene索引實現打下基礎。
索引文件的整體結構
如下圖,這是整個索引文件的整體結構,可以看到,實際上lucene索引保存下了相當多的東西
但是,單從上面的文件羅列,很難看出來一個整體的結構,那么,接下來這張圖就向我們展示這個結構,原圖來源於網絡,但是由於已經過時,我根據lucene最新的版本重新畫了一張。如果相對比3.0版就會發現,一些文件后綴也被改變了,比如tis,tii變成新的tim,tip,另外,實際上del文件也沒有使用了,究其原因是writer會動態計算被刪除的文件,而不是寫入文件。
索引文件中最重要的結構便是倒排索引了,如下圖,其中Dictionary就是所有term的集合,放在tim和tip中,而posting list則存放文檔id,詞頻和單詞出現的位置,放在pos和doc中,其中doc存放的是詞頻,pos存放的是單詞位置。
編解碼器
索引的文件格式有可能會進化,一旦版本更新之后就不能再支持其他的索引文件格式,或者說一個lucene版本只能支持lucene自己的索引勢必會降低lucene的靈活性,那么如何保持索引文件格式的靈活性和動態擴展性也是一個值得考慮的問題,lucene采用編解碼器(codec)來實現這種靈活性。
編解碼器是lucene中負責與索引文件直接讀寫的模塊。所有的上層調用都基於編解碼器,這是代碼模塊化的結果。我們來看編解碼器的一些設計思想。
首先是LuceneXXCodec,這是Codec的直接實現者,不同的版本可能會實現不同的codec,例如,lucene4.5就是Lucene45Codec。codec的實現采用了facade模式,屏蔽了后面的所有format
因為不同的版本可能會有不同的格式,所以對應將這些格式抽象出來對於可擴展性就尤為重要了。也正是因為如此,lucene前面的版本和后面的版本格式可能差別會很大。對於我們了解lucene文件格式可能並不太好。但是lucene索引中許多精髓都類似,因而他們還是相通的,理解一種格式便於我們了解另一種。
在lucene4系列中,4.0的實現是所有格式中最全的,其他新版本可能或多或少依賴了老版本,所以可能你運行的是lucene4.5,但實際上看到的索引文件是Lucene41_0.doc。對於幾個期望更靈活的類和格式,lucene采取注冊查找的方式來獲得。NamedSPILoader就是負責查找Codec,PostingFormat和DocValuesFormat的類,而注冊的類會放在下面的文件里。org.apache.lucene.codecs.lucene41.Lucene41Codec便是配置在Codec中的。
轉自:http://blog.csdn.net/liweisnake/article/details/10956645