ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Fastcat] Search에 대해 알아보자 (1)
    개발하면서/코드보면서 2011. 9. 10. 14:45
    반응형

    지금까지 fastcat의 인덱싱, 사전에 대해 알아보았습니다.
    남은건 Search.....훑어봤는데.....어후;;; 길어질것 같아요 ㅋㅋ

    제가 학습한 것들을 최대한 알기 쉽게 설명하는게 이 블로그의 목적입니다.

     

    제가 이해된 부분, 추측하는것들이 있으니 틀린점, 애매한점 이런거 알려주시면 감사하겠습니다. 환영합니다~! : ) 
    피드백 하나가 포스트에 힘을 실어줍니다 ㅋㅋㅋ

    Search에 대해 알아보도록 하겠습니다. (편의상 존댓말은 생략합니다.)
    --------------------------------------------------------------------------------------------
    우선 Search 부분의 class Diagram은 다음과 같다.

     

     


    loadSearcherAndReader()를 실행하기에 앞서서 어떤 색인 파일을 읽어 드려야 할지 정해야 한다.
    collectInfo, segmentInfo를 읽어 들이는 부분이 있고, 그의 결과는 다음과 같다.

     

     

     



    loadSearcherAndReader를 살펴보자.

    segmentSearcherList = new SegmentSearcher[DEFAULT_SIZE];
    documentReaderList = new DocumentReader[DEFAULT_SIZE];
    
    if(segmentSize > 0){
    	//last segment.
    	SegmentInfo segmentInfo = segmentInfoList[segmentSize - 1];
    	File lastSegmentDir = segmentInfo.getSegmentDir();
    	int lastRevision = segmentInfo.getLastRevision();
    	try {
    		for (int i = 0; i < segmentSize; i++) {
    			SegmentInfo si = segmentInfoList[i];
    			File segmentDir = si.getSegmentDir();
    			int baseDocNo = segmentInfoList[i].getBaseDocNo();
    			int revision = segmentInfoList[i].getLastRevision();
    			
    			BitSet deleteSet = null;
    			if(i < segmentSize - 1){
    				deleteSet = new BitSet(IRFileName.getRevisionDir(lastSegmentDir, lastRevision), 
    IRFileName.getSequenceFileName(IRFileName.docDeleteSet, i));
    			}else{
    				deleteSet = new BitSet(IRFileName.getRevisionDir(segmentDir, revision), IRFileName.docDeleteSet);
    			}
    			
    			segmentSearcherList[i] = new SegmentSearcher(schema, segmentDir, baseDocNo, deleteSet, revision);
    			documentReaderList[i] = new DocumentReader(schema, segmentDir, baseDocNo);
    		}
    	} catch (IOException e) {
    		throw new IRException(e);
    	}
    }


    segmentSize만큼 for문 돌면서 segmentSearcher, documentReader를 읽어 들인다.

     

     

     


    data, data1, data2(sample에서는 3개) 안에 있는 0, 1, 2...의 폴더 갯수가 segmentSize이다.
    revision, segment 변경 부분은 증분색인 학습할때 더 자세히 알아보도록 하는게 좋을것 같다.

    자~ 그럼  DocumentReader가 어떻게 구성되는지 알아보자.
    먼저 DocumentReader를 보면, 생성자, readDocument, close 세개의 method로 구성되어있다.
    생성자에서는doc.stored, doc.position의 파일 포인터를 열고(C에서는 이렇게 말하는데...음....ㅋㅋ)
    총 문서 갯수와, 압축한 문서들의 크기(DOCUMENT_BLOCK_SIZE)를 읽어 들인다. 


     DocumentWriter
    에서 말한대로 문서를 찾는다. 찾으려는 문서번호 / DOCUMENT_BLOCK_SIZE로 압축된 문서의
    index를 찾아내고 int형 만큼 읽어서 압축된 문서의 크기를 알아내고, 압축된 문서를 읽고 압축을 풀어서,
    찾으려는 문서번호 DOCUMENT_BLOCK_SIZE 의 위치한 문서를 읽어오는 방식이다.


    성능 향상을 위해 이전 단계와 동일한 압축 문서의 index를 가져오는 거라면,
    압축 위치를 찾고, 압축을 풀고 하는 과정을 생략하고 기존에 있는 데이타 가지고 문서를 가져온다.
     
    다음 post에서는 SegmentSearcher에 대해 알아보기로 하자.

    반응형

    댓글

Designed by Tistory.