2014-02-20 60 views
0

我是新來的Lucene在Java中。我遇到了一個很奇怪的問題:爲什麼我不能刪除索引目錄在Lucene之後我讓搜索器爲空?

該服務部署在tomcat(struts 2)。當服務啓動時,它將創建索引和搜索器實例來提供搜索服務。

然後我想更新索引而不停止服務。所以我創建了另一個索引目錄,在此之後,我使用新的索引目錄前提到搜索者。然後刪除舊的目錄。但問題來了,我無法刪除舊的目錄。 The message says the directory is still being used by an application.

但是爲什麼?我已經切換了索引目錄並關閉了搜索者的前indexReader。我錯過了什麼嗎? Lucene的版本是4.3。

錯誤消息如下:

Unable to delete file: D:\Projects\.metadata\.me_tcat\webapps\nlp\WEB-INF\data\[email protected]\diag\_0.nvd 

不過,我已經叫indexReader.close()indexDirectory.close()

順便說一句,有沒有什麼方法可以找到哪個線程在java中使用目錄?

如果我困擾你,我很抱歉我的英語。

回答

0

其實你不能刪除該文件夾,因爲當你創建一個新的IndexWriter它會鎖定該文件夾,並且不允許任何其他應用程序或服務來修改該文件夾。安全問題。

我相信,如果你想刪除這是你不得不說

IndexWriter.close(); 

文件夾,如果你有一個打開的IndexSearcher的是文件夾,你還需要說:

Directory directory = null; 
DirectoryReader ireader = null; 
try { 
    directory = FSDirectory.open(new File("path")); 
    ireader = DirectoryReader.open(directory); 

} catch (Exception e) { 
// 
} finally { 
try { 
    if(directory != null) { 
     directory.close(); 
    } 
    if(ireader != null) { 
     ireader.close(); 
    } 
    }catch(IOException e) { 
     // 
    } 
} 

這將解鎖文件夾並使其可編輯。

+0

實際上,當我完成索引文檔時,我調用IndexWriter.close(),然後使用新索引文件夾初始化搜索器。 –

+0

然後,我想刪除舊的索引文件夾,出現消息:「文件夾中的文件正在被應用程序使用」。但搜索者正在使用新的索引文件夾,我不知道爲什麼我不能刪除舊的文件夾 –

+0

你說當服務啓動時它會創建一個新的'IndexWriter'和'IndexSearcher',然後創建一個新的索引文件夾,並希望刪除舊的,所以你不能刪除舊的,除非你調用'IndexWriter.close()'和'IndexSearcher.close()' – Salah