제 블로그에 올린 글이라... 좀 딱딱할수 있습니다. 이해 부탁드리며 대부분 이방식을 사용하고 있지 않을까 합니다만...
그렇게 수준 높은 글이 못되어 죄송할 따름입니다.
==============================================================================================

루씬(Lucene)은 증분색인을 지원하지만 자료의 추가와 최적화(optimize)에 많은 오버헤드가 걸리는 문제점이 있다. 모두가 아는것처럼 최적화에 24 시간 이상을 잡아 먹기도 한다.
최적화와 서비스의 연관성을 살펴보면 최적화 작업중에는 검색서비스의 속도가 현저히 떨어진다는 문제점이 있는데 루씬이 가지는 양면의 칼날 같은 장단점이라 어쩔 도리가 없는게 현실이다.

자료의 양이 많아지면 수십기가(GB) 혹은 수백기가(GB)까지 용량이 증가하게 되는데 무조건 최적화 한다는 것도 문제고 무작정 파일수를 늘려가며 증분색인을 한다는 것도 문제가 된다.

JSP와 연동하는경우 더더욱 복잡한 문제가 되곤하는데 다봇의 경우 아래 그림과 같이 3개의 폴더를 이용해 실시간(--) 증분색인을 처리하고 있다.
물론 최대 2,000만건의 자료를 상정하고 책정한 정책이므로 1억건 정도의 자료를 처리하기
위해서는 별도의 정책이나 HADOOP과 같은 병렬처리 구조를 차용해야만 한다.

처리 순서

  1. 크롤러(crawler)에 의해 수집된 자료가 DB(MySQL)에 저장된다.

  2. Indexer.java 가 무한대로 반복하여 작업을 수행하며 DB에 최종 인덱싱된 자료로 부터
     100개 이상의 자료가 추가되었거나 지정된 시간(다봇은 5분)을 충족하면 개수에 상관없이
     "a폴더"에 자료를 기록하고 무조건 최적화를 수행한다.
     (다봇은 10,000개까지 'a폴더"에서 최적화를 수행하며 쌓인 자료의 개수에 따라 0.1~5초
     내외의 최적화 시간이 소요된다)

  3. "a폴더"에 10,000개의 자료가 쌓이면 "aa폴더"에 addIndexes 메쏘드를 이용해 병합처리
      한다. 병합이 완료됨을 확인한후 "a폴더"의 내용을 삭제처리함.

  4. "aa폴더"에 100,000개의 자료가 쌓이면 "aaa폴더"에 addIndexesNoOptimize 메쏘드를 이용해
      최적화 하지 않고 병합처리하도록 한다. 물론 병합이 완료되면 "aa폴더"의
      내용은 삭제처리한다.

  5. "aaa폴더"는 다봇의 경우 10만개 짜리 파일이 10개 정도 쌓이는 시점 그주 주말 새벽
      시간을 이용해 병합처리를 행하고 있다.
     

사용자 삽입 이미지
이 게시물을..