標籤: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.