2013-04-24 63 views
4

嘗試一些Lucene的3代碼轉換爲Lucene的4之間的區別,在Lucene的4是什麼AtomicReader和CompositeReader

我想用termEnums.docs(ir.getLiveDocs())到不僅回報文檔已被刪除一個特定的期限。然而,getLiveDocs()僅適用於AtomicReaders,雖然我只有一個索引,但它是基於文件的,並使用DirectoryReader(它是CompositeReader的子類)。

所以我想我可以使用SlowCompositeReaderWrapper,但名稱阻礙了我,但我不明白的是,幾乎沒有人使用基於文件系統的索引,幾乎沒有使用CompositeReaders的每個人?

然而,文檔似乎暗示我們應該使用AtomicReaders,但我不明白我如何可能做到這一點與基於文件的索引,也許如果基於文件的索引只有一個段,但不是段創建由Lucene提供,因爲它需要它們,而且通常不受最終用戶應用程序的嚴格控制。

+0

我可以問你答案是否有用嗎?如果是的話,你可能想接受它。 – javanna 2013-05-27 21:41:41

+0

javanna是的,它是有用的,雖然我希望多一些答覆,因爲林不知道寫我的代碼,這種改變似乎仍然使lucene不必要地複雜 – 2013-06-02 10:17:25

+0

我明白你的觀點!我同意這非常棘手,另一方面,這是人們在使用lucene時需要注意的事情。這就是爲什麼彈性研究通常更適合的主要原因之一,即使是對於當地的小型指數;您實際上可以專注於您的數據,而無需瞭解有關lucene的所有詳細信息。 – javanna 2013-06-02 10:47:52

回答

6

好問題。這可能是從lucene 3遷移到lucene 4時彈出的最常見的一個。012xx首先看看this article,這解釋了重構背後的原因。

基本上所有內容都是在lucene中的每個段,但一些lucene 3 API沒有反映出這一點。在lucene 3中,IndexReader公開的一些方法只是合併來自所有細分市場的很多信息,並且執行緩慢的事情,這就是SlowCompositeReaderWrapper命名背後的原因。這個想法是從每個細分市場獲取您需要的信息並自行合併。一個AtomicReader使您能夠訪問單個段,而CompositeReader是整個索引的視圖,但並未公開過去通過IndexReader可用的所有方法。

+0

Thx,我有這個概念,但我沒有看到我自己處理多個段的優勢,而不是lucene爲我處理它,我沒有看到我能以更高性能的方式做到這一點。 – 2013-04-25 16:03:45

+0

Tha的優點是,如果你這樣做,它的速度更快,但在代碼方面卻毫無用處。更快,因爲您只讀取需要的信息,而不是使用lucene執行太多即時合併,而這些並不需要。 – javanna 2013-04-25 19:31:46

+0

我仍然沒有得到它,如果我有一個索引運行在多個分區,我怎麼能寫我的代碼需要從多個分區讀取東西,因此它比lucene 3代碼更快。 – 2013-04-26 06:31:37