Apache Lucene 3 (Search Engine)

Apache Lucene 3 (Lucene Indexing Class)


1. IndexWriter

IndexWriter는 루씬 Core에 정의된 기본 클래스로, 색인 생성 및 관리에 사용(IndexWirterConfig, Directory 클래스도 색인 담당)

1-1. IndexWriter 클래스 주요 메소드

IndexWriter 클래스는 색인 전체의 과정을 총괄하는 클래스이다. 색인을 만들고 색인에 Document를 추가하는 작업은 IndexWriter를 통해서만 가능하다.

  • IndexWriter의 주요 메소드
    • addDocument(Document) : 도큐먼트를 추가한다.
    • close() : 열린 모든 자원을 닫고 쓰기 잠금을 해제 한다.
    • commit() : 보유 중인 모든 변경사항 (도큐먼트 추가, 삭제, 세그먼트 병합, 추가 색인 등)을 색인에 적용하고 참조된 모든 색인 파일을 동기화해 변경사항을 적용한다.
    • flush() : 모든 인메모리 세그먼트를 메모리로 이동한다. 디렉터리에 저장은 하지만 커밋은 하지 않은다.
    • forceMerge() : Merge(병합)정책을 사용해 세그먼트가 병합 될 때까지 병합한다.
    • forceMergeDeletes() : 도큐먼트를 삭제한 모든 세그먼트를 병합한다.
    • updateDocument() : 텀에 해당하는 도큐먼트를 먼저 삭제하고 새 도큐먼트를 추가 해 도큐먼트를 업데이트 한다.
    • deleteDocument() : 도큐먼트를 삭제한다.
  • IndexWriter 특징

IndexWriter 객체를 사용하면 사용 중인 디렉터리에 Lock(잠금)파일이 생성된다. 이를 통해 동시에 같은 자원에 접근하는 것을 막아 동시성을 관리한다. 만약에 같은 디렉터리에서 다른 IndexWriter를 사용하려 하면 IOException이 발생한다. IndexWriter는 색인에 대한 쓰기 엑세스 권한이 있고, 그 메소드를 사용하는 유일한 클래스이므로 색인에 도큐먼트를 추가 할 수 있다.

  • IndexWriter 사용 방법

      // IndexWriter 객체 생성
      // 첫번째 인자(index) : 색인 저장 디렉터리 위치
      // 두번째 인자(config) : 색인 설정 클래스
      IndexWriter writer = new IndexWriter(index, config);
      // 도큐먼트 생성
      Document doc = new Document();
      // 색인에 도큐먼트 추가
      wirter.addDocument(doc);
      // indexWriter 자원 반환(닫기)
      writer.close()
    

2. IndexWriterConfig

IndexWriter 의 설정 값을 IndexWriterConfig 클래스를 통해 설정 할 수 있다.

  • IndexWriterConfig 주요 메소드
    • setOpenMode(IndexWriterConfig.OpenMode) : 색인 생성 시 모드를 설정한다.
      • CREATE: 새로운 색인을 생성 또는 기존 색인을 덮어쓰기
      • APPEND: 기존 색인을 열어 추가 한다.
      • CREATE_OR_APPEND: 기존 색인이 없으면 생성하고 있으면 색인을 연다.
    • setRAMBufferSizeMB(Double) : RAM 버퍼 사이즈 조절
    • setUseCompoundFile(Boolean) : 루씬 내부적으로 세그먼트를 관리하는 특별한 복합 파일을 사용할지 여부를 결정. 기본값은 True 이며, 크기가 큰 색인을 색인 하는 배치의 경우 false 로 두는 것이 좋다.
    • 색인 커밋 크기 설정
  • IndexWriterConfig로 분석기 설정

IndexWriterConfig 설정 시 분석기를 같이 설정 할 수 있다. ex. StandardAnalyzer(기본 텍스트 분석기로 a, the 와 같은 불용어 제거, 대문자 소문자 변환 등의 분석기 설정이 있다.)

  • IndexWriterConfig 사용 방법

      // 분석기 설정
      StandardAnalyzer analyzer = new StandardAnalyzer();
      // IndexWriterConfig 객체 생성
      IndexWriterConfig config = new IndexWriterConfig(analyzer);
      // 색인 시 복합파일 사용 여부 결정, 기본 true
      config.setUseCompoundFile(false);
      // 추가 메소드
      config.setOpenMode(CREATE_OR_APPEND);
      // 설정한 IndexWriterConfig 를 사용해 IndexWriter 객체 생성
      IndexWriter writer = new IndexWriter(index, config);
    

3. Directory 클래스

색인은 지정된 디렉터리에 여러개의 파일로 저장된다. Directory 클래스는 데이터를 저장하는 추상클래스로 디렉터리에 읽고 쓰는 기능을 맡는다. 루씬에서 디렉터리란 색인이 저장된 위치를 나타내는 추상클래스이자, 색인 파일 목록이다.

  • Directory 주요 메소드
    • createOutput(String name, IOContext context) : 신규, 빈 파일을 디렉터리에 생성한다.
    • deleteFile(String name) : 디렉터리 안의 파일을 삭제한다.
    • listAll() : 디렉터리 안의 파일 목록을 가져온다.
    • obtainLock(String name) : 잠금 획득
    • openInput : 파일을 읽는 Stream(스트림)을 가져온다.
  • Directory 종류
    • Ram based indices(램기반 색인)
      • 모든 색인을 메모리에 임시 저장한다.
      • RAMDirectory는 디스크에 아무것도 쓰지 않아 FSDirectory 보다 처리속도가 빠르다.
      • 하지만 램은 휘발성으로 자바가 중단되면 색인도 사라진다.

           Directory directory = new RAMDirectory();
        
    • FSDirectory(파일 시스템기반 색인)
      • 램기반 색인과 달리 실제 파일 시스템에 색인을 저장한다.
      • 파일시스템에 저장하면 _0.cfe, _0.cfs, _0.si, segments_1, write.lock 등의 색인 관련 파일이 같이 생성된다.

         Directory directory = FSDirectory.open(Paths.get("./index"));
        
  • Directory 사용방법

      // Directory 객체 생성(RAM, FS)
      //Directory directory = new RAMDirectory();
      Directory directory = FSDirectory.open(Paths.get("./index"));
      // IndexWriterConfig 설정
      IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
      // IndexWriter 설정
      IndexWriter writer = new IndexWriter(directory, config);
    

4. Indexing Class 정리

Directory directory = FSDirectory.open(Paths.get("./index"));
IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter writer = new IndexWriter(directory, config);
Document doc = new Document();
wirter.addDocument(doc);
writer.close()