2014-02-20 2 views
0

나는 java에서 Lucene을 처음 사용하고 있습니다. 나는 매우 이상한 질문을 만났습니다 :검색자를 null로 만든 후 Lucene에서 색인 디렉토리를 삭제할 수없는 이유는 무엇입니까?

서비스가 tomcat(struts 2)에 배포되었습니다. 서비스가 시작되면 검색 서비스를 제공하기 위해 인덱스와 검색 자 인스턴스를 생성합니다.

그런 다음 서비스를 중지하지 않고 색인을 업데이트하려고합니다. 그래서 다른 인덱스 디렉토리를 생성 한 후, 새로운 인덱스 디렉토리를 사용하기 전에 언급 된 검색자를 만듭니다. 그런 다음 이전 디렉토리를 삭제하십시오. 그러나 여기에 문제가 발생했습니다. 이전 디렉토리를 삭제할 수 없습니다. The message says the directory is still being used by an application.

왜 그렇습니까? 나는 색인 디렉토리를 바꾸고 검색자를 위해 이전 indexReader을 닫았다. 나는 무엇이든 놓친다? Lucene의 버전은 4.3입니다. 다음과 같이

오류 메시지는 다음과 같습니다 그러나, 나는 indexReader.close()indexDirectory.close()라고 한

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

.

그런데 어떤 스레드가 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

관련 문제