본문 바로가기

Lucene

[lucene] Directory. 실시간 Document 추가.

루씬에서 색인이나 검색을 할 때

IndexWriter 그리고 IndexReader를 생성합니다.

생성법은 간단합니다.

Directory dir = FSDirectory.getDirectory(dirPath);
IndexReader reader = IndexReader.open(dir);
IndexWriter writer = new IndexWriter(dir,Analyzer, true);

물론 맨 앞 파라메터인 dir은 String으로 path를 줘도 됩니다. 어차피 내부적으로 Directory 객체를 생성하여
초기화 시킵니다.

IndexWriter의 제일 마지막 인자인 boolean 값은
새로운 Document를 Index에 추가 할 때 append 할 것인지 overwrite할 것인지
정해주는 것입니다. (false = append)

이것을 이용하면 실시간 색인 추가의 기본 기능을 구현 할 수 있습니다.

별건없고 그냥 색인하는 거랑 똑같습니다. 뒤에 인자만 false로 주고..
Field를 생성하여 Document를 만들고 이 Document를 writer에 추가하는 겁니다. 그러면 새로 추가된 document가 append 됩니다.

일단 이정도면 색인추가 기능은 대충 구현이 되지요.....

문제는..

윈도우에서 위 기능을 구현해보고 index를 optimize 해봤는데
새로운 인덱스 파일 (.cfs)이 생기고 옛날 인덱스 파일이 지워지지 않고 그대로 남아있는겁니다.

(더 정확히 얘기하면 색인 파일을 읽으려고 IndexReader로 읽어온 상태)

딱 두개만 남습니다. 방금 새로 optimize한 인덱스..
그리고 old index...

이유를 찾아보니..
윈도우에서는 읽으려고 열은 파일의 삭제를 허용하지 않기 때문이라는데..

실제로 Writer로 도큐먼트를 추가 후 optimize 했을 경우에는 정상적으로 하나의 색인 파일만 남습니다.

하지만 한번이라도 IndexReader로 색인을 읽어들인 후라면 위 경우처럼 색인 파일이 2개가 남습니다.

디렉토리에서 색인 파일을 강제로 지우려 해도 지워지지 않죠. 윈도우는 다른 프로그램에서 사용중인 파일은

삭제를 하지 못 하게 하니까요...

이것을 해결 할 방법이 없을까..생각 중입니다.

FSDirectory를 생성할때 뒤에 FSDirectory.getDirectory( dir, true ) 이렇게 true로 주면

예전 파일을 삭제한다고 하는데..

저게 2.3.2에서는 deprecated된 메서드인지라..사용하기가 좀 그렇고....

어떻게 해야 할지...음..고민중입니다.

물론 reader와 searcher를 close 하고 optimize를 하면 색인 파일이 하나만 남기는 하지만서도...

운영중에 저렇게 close를 할 수는 없으니까요...

좋은 방법이 없을까요??

...................................................

일단 IndexSearch로 addDocuemet를 한 후에는 writer.close() 호출을 통해 파일을 잡고 있는것들이 풀리기
때문에 문제가 안됩니다.

보니까 IndexReader가 문제인듯 하네요..

최초에 1.cfs 색인파일이 있다고 하면 , 검색을 하게 되면 IndexReader는 이 1.cfs를 읽어들일겁니다.
그후 addDocument를 하고 optimize를 하면 2.cfs가 생기고 본래는 1.cfs를 지워야 하는데 이걸 못 지우니까
1.cfs와 2.cfs가 생기게 됩니다. 결국 두개다 IndexReader가 잡고 있는 상태가 되어버리지요..

이상태에서 다시 addDocument후 optimize를 하면
3.cfs 가 생기고... 1.cfs와 2.cfs를 지우지 못 해 3개의 색인 파일이 남게 됩니다. 테스트결과 이런식이면
색인 파일이 계속 늘어나네요..

어차피 Document가 add된 후에는 새로 색인 파일을 열어야 합니다. 그렇지않으면 새롭게 추가된
document를 가져오지 못 하더라구요..

이때 기존에 열려있던 IndexReader를 close 해주고
새롭게 열어야 기존의 파일이 삭제 가능한 상태가 된다는 뜻이네요.

그렇다면 이 부분을 이용해서 따로 파일을 삭제하는 것을 구현해야 할까요.. 음..