本篇文章,就來介紹與Directory家族常常進行交互的另外一你們族IndexReader家族,另外須要說明的是,如今介紹的一些聶榮都是基於最新版Lucene4.6.0的版本,不過在這裏就再也不進行修改了,由於Lucene更新版本太活躍。
java
先來看下IndexReader家族的家族譜圖。
架構
下面是咱們在使用lucene是常常用用到的代碼:app
directory=FSDirectory.open(new File(indexReadPath));//打開索引目錄 IndexReader reader=DirectoryReader.open(directory);//獲取數據句柄
IndexReader是一個抽象的接口實現,提供了一個接口用於訪問索引文件,由此咱們能夠推斷出,任何一個讀取索引的操做,就必須用到一個IndexRe的實現類來輔助完成,不然咱們是不能直接讀取索引信息的。spa
繼續看下去咱們會發現IndexReader接口下面由兩大類型的Reader實現,一個是基於AtomicReader實現的原子類型,另外一個是基於CompositeReader實現的符合類型,那麼這兩個直接子類,究竟有什麼區別和聯繫呢?
線程
實際上,他們之間的聯繫咱們從上圖中,就能清晰的看出來,他們都是實現了相同的父接口,因此說從某種程度上來說,它們之間是能夠轉換的,事實上也的確如此。在AtomicReader的子類裏面提供了一個SlowCompositeReaderWrapper的包裝類,來把一個CompositeReader的子類,模擬成一個原子Reader。設計
那麼,CompositeReader和AtomicReader它們之間究竟有什麼區別呢?code
AtomicReader相對來講更細化,提供了具體層面訪問索引文件內容的實現,而CompositeReader則在宏觀的方向上,提供了讀取索引文件,以及匯合多個索引的功能。索引
能夠打這麼一個比方,CompositeReader是一個相似半徑爲10的圓,而AtomicReader則是一個相似半徑爲5的圓,而咱們的索引存儲的數據就在圓心上,固然咱們的這個假設是基於立體3維的圓,那麼如今,我想獲取圓心上的數據,不管你從哪一個方向,哪一個位置切入,都必須的先通過大圓的範圍,而後通過校園的範圍,最終咱們才能獲取圓心上存儲的數據,因此咱們說CompositeReader在宏觀上起到了讀取索引文件(多是多份索引的讀取【能夠是單線程的讀取,也能夠是並行讀】及合併)的做用,而AtomicReader則在微觀的角度上,起到了讀取索引文件內容的做用,經過二者結合,咱們就能夠完美的讀取索引文件。接口
在IndexReader的旗下,又旗幟鮮明的分紅了兩個基類,這兩個基類的下面的各個子類之間,既有區別也有聯繫,只有相互協做,才能高效的完成讀取實現,固然這些lucene都給咱們已經封裝好了,咱們能夠在咱們任何須要的時候,來調用他們來完成特定的工做,除此以外,咱們也能夠來自定義咱們本身用的特定的reader,來完成某些不常見的功能,由於lucene給咱們提供了一個很是方便、強大,並且易擴展的接口,由此能夠看出lucene的設計架構充分利用接口和一些抽象類的組合,來使總體設計變靈活和易擴展。it