본문 바로가기

Lucene

[lucene] FSDirectory와 RAMDirectory를 활용한 인덱싱 구현

루씬인액션 책을 보면 FSDriectory와 RAMDirectory를 사용하여 RAMDirectory를
버퍼의 개념으로 활용한 인덱싱 예가 나옵니다. 이걸 한번 테스트 해보려고 해봤는데
잘 안되는 것 입니다.

일단 책에 나온 예는 아래와 같습니다.

FSDirectory fsDir = FSDirectory.getDirectory(dirPath, true);
RAMDirectory rmaDir = new RAMDirectory();

IndexWriter fsWriter = IndexWriter(fsDir, new SimpleAnalyzer(), true);
IndexWriter ramWriter = IndexWriter(ramDir, new SimpleAnalyzer(), true);

while(..) {
ramWriter.addDocument(doc);
}

if(condition for flushing) {

fsWriter.addIndexes(new Directory[] {ramDir});

ramWriter.close();

ramWriter = new IndexWriter(ramDir, new SimpleAnalyzer(), true);

}

이것을 기반으로 소스를 코딩해서 테스트 해봤는데 안됩니다.
이거 뭥미?
구글링으로 열심히 찾아본 소스도 있었는데 그것도 테스트 해봤지만 안됩니다.
인덱스 디렉토리에는 딸랑 segments 파일만 생겨 있더군요.


그래서 루씬 메일링 리스트에 질문을 올렸고, 몇분 되지 않아서 답이 왔습니다.

"I think you should do the addIndexes after the ramWriter close, but that's just a guess, as I haven't tried it"

그래도 한번 속는셈치고 해봤더니 정상적으로 작동하네요 -_-

책은 1.4.X버젼이고 제가 현재 사용하는 것은 2.3.2 버젼이다 보니
아무래도 Writer에서 Lock을 잡고 있느냐에 따른 처리 로직이 변경된 듯 합니다.
ramWriter에 Lock이 잡혀 있는 상태에서 인덱스를 머지하는 것은 허용되지 않는듯 합니다.

그래서 간단하게, addIndexes를 실행하기전에 ramWriter를 close하는 것으로
처리를 했습니다.

그런데 생각만큼 빨라지지는 않네요 -_-;

이게 jvm heap memory를 늘려주고, 임계치까지 최대한 램에다 인덱싱을 하고 addIndexes를 최소한으로 사용하는 것이 관건이 되는 듯 합니다.

다른 요소들이 더 영향을 많이 미치는지...흠..;