IndexReader關閉的問題

來源:互聯網
上載者:User

標籤:lucene   即時搜尋   

即時搜尋設計開發中,IndexReader在飲用計數變為0時調用doClose,而SegmentReader則有一個addCoreClosedListener方法控制在SegmentCoreReaders關閉時的操作,搜尋Lucene的代碼只有在FieldCacheImpl中看到調用,其中的回調>是讓SegmentCoreReaders關閉之後從field cache中刪除field cache。
查看Lucene core 4.0的代碼,使用的FieldCache只有Field Comparator,FieldCacheRangeFilter,FieldValueFilter等,看起來如果完全基於docvalues做排序和filter,不需要考慮。
另外如果考慮的話,filed cache基於docId,所以記憶體索引快照並不需要每個都對應一個field cache,只要映射到最新的field cache即可,只要讀取時不逾越max doc id即可。因此RamIndexReader.getCoreCacheKey返回對應RamIndexWriter即可。
另外,SegmentCoreReaders的關閉檔案控制代碼操作時IOUtils.close(termVectorsLocal, fieldsReaderLocal,...)。
即時搜尋時每個IndexSearcher都需要關閉其Reader的,這樣在重複開啟時不會有遺漏的檔案控制代碼。

要真正釋放資源,應該在new新的即時搜尋searcher時不操作(new時自動有一個引用計數了),在searcher替換時調用舊Reader的decRef方法。
搜尋前調用一次incRef,搜尋完成調用一次decRef。

具體到記憶體索引Reader,其doClose可以什麼都不做。

RealTimeIndexWriter的close,分別調用RamIndexWriter的close方法,SegmentReaderAndLiveDocs的close方法。SegmentReaderAndLiveDocs內部有一個即時的SegmentReader,它也要Close。每次快照產生的SegmentReader共用一個core。ConcreateCompositeReader incRef和decRef時應該對下面的所有AtomicReader操作。
這種手動的incRef,decRef方法比較笨,而且容易出錯,如果用Java7可以直接使用AutoClosable.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.