2011-07-04 71 views
1

上下文:
輔助器外觀類爲我的應用程序提供搜索方法。 由於性能不成問題,因此會爲每個查詢創建一個新的IndexSearcherLucene 2.9.2:AlreadyClosedException在實例化IndexSearcher時

對於每個查詢,一個新的搜索創建這樣的:

File indexFile = new File(String absolutePathToIndex); 
IndexSearcher searcher = new IndexSearcher(indexFile.getAbsolutePath(), true); 

有時我得到的AlreadyClosedException我不理解,因爲沒有共享搜索的對象。

任何想法?有關如何打開索引的最佳做法?已知的問題? 謝謝。

堆棧跟蹤:

org.apache.lucene.store.AlreadyClosedException: this Directory is closed 
     at org.apache.lucene.store.Directory.ensureOpen(Directory.java:251) 
     at org.apache.lucene.store.FSDirectory.listAll(FSDirectory.java:530) 
     at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:585) 
     at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:69) 
     at org.apache.lucene.index.IndexReader.open(IndexReader.java:476) 
     at org.apache.lucene.index.IndexReader.open(IndexReader.java:243) 
     at org.apache.lucene.search.IndexSearcher.<init>(IndexSearcher.java:78) 

建議的解決方案#1:要走的路?

Directory directory = FSDirectory.open(File indexFile); 
IndexSearcher searcher = new IndexSearcher(directory, true); 
...do the query... 
searcher.close(); 

問題:對於每個查詢創建從溶液#1中的上面的代碼。是否有必要關閉目錄呢?檢查了Lucene 2.9.2的源代碼後,searcher.close()未關閉與內部reader關聯的directory對象。

回答

0

如果錯誤只發生在高併發加載,它表明也許你有多個線程試圖關閉目錄或試圖從已經關閉的目錄讀取。你還沒有弄清楚absolutePath是一個方法內部的局部變量,還是一個被多個線程重用的對象中的實例變量 - 所以很難猜測。

+0

更正......爲什麼要多個線程試圖關閉同一個對象?每個線程都有自己的IndexSearcher實例。 – basZero

1

反正這個例子中調用的方法反正不贊成。所以也許使用IndexSearcher(Directory path, boolean readOnly)顯示出不同的行爲。

您需要確保在每次後續搜索結束前都不要關閉目錄。例如,如果您多次使用此目錄並重新實例化搜索器,另一個搜索器將被銷燬,並可能在析構函數中關閉目錄。

因此,如果您已經使用ctor的未棄用版本,請嘗試爲每個搜索器使用新的Directory實例。

+0

創建IndexSearcher實例後,它執行一個查詢並關閉搜索器。搜索器對象本身沒有返回,所以絕對保證這個對象不再有任何動作,在單個查詢之後... – basZero

+0

我不是指搜索器對象,而是指與搜索器相關聯的目錄。最緊迫的問題將是如果您使用Deprecated字符串路徑構造函數或目錄構造函數。 – fyr

+0

我正在使用String構造函數,請參閱代碼,第二行 – basZero

相關問題