Search Engine2007. 8. 6. 11:19

http://kldp.org/comment/reply/77804/366881

검색엔진은 크게 3부분으로 나뉘는데요,

1. crawl
2. 색인 DB 생성
3. 검색

crawl은 웹문서를 긁어오는 엔진입니다. 웹문서를 긁어오고 링크의 그래프를 만든다음에, 그래프를 방문하면서, 웹문서를 긁어옵니다.

crawl로 얻어온 문서를 이용해서, 의 목록을 만드는 작업입니다. 문서를 토큰을 이용해서 쪼갠다음에, 의 목록을 만들고 나중에 이걸 다시 로 역변환 해서 파일로 저장합니다. 검색은 실질적으로 Term을 키로 하기 때문에, 정렬되어서 저장이 되어야 겠죠.

검색엔진은 사용자 질의어를 분석후 색인DB를 뒤져서 해당 Term을 포함한 문서의 정보를 얻어오는 부분입니다. 단순히 가져오는 정도로는 원하는 품질의 검색결과를 내놓을 수 없기 때문에, 나름대로의 검색알고리즘이 필요한 영역입니다.

필요한 기술은 대략 다음과 같습니다.
1. 대용량 데이터 처리기술, 1억건의 문서가 있다면 1주일이내에 crawl을 해서 색인파일을 생성해야 합니다. 물론 crawl엔진을 만드는 것도 상당한 도전과제인데, nutch와 같이 잘만들어진 툴이 있으니 이 툴을 사용하면 될겁니다.
대용량 분산처리 기술을 위해서 MapReduce 프로그래밍 모델이 사용되고 있습니다. 이 기술로 crawl, 색인DB생성등의 작업을 더 빠른시간내에 처리할 수 있습니다.
2. 효과적인 검색 알고리즘
검색엔진의 최소 요구사항은 100만건의 문서에서 검색어를 던졌을 때, 최소 0.5초 이내에 결과가 나오도록 해야 한다는 겁니다. 이건 순전히 자료구조와 알고리즘과 연관된 문제죠.
일반적인 방법으로 문서를 검색하고 스코어공식을 적용해서는 이 요구사항을 만족 시킬 수가 없거든요.
이건 캐쉬를 사용하지 않았음을 가정했을 때의 요구사항이구요, 캐쉬등을 사용할 것을 가정 하면 1000000만 건 문서 기준 0.5초이내로 시간을 맞추어야 합니다.
3. 형태소 분석
특히 한글문서를 제대로 검색하기 위해서는 필수적이며, 제대로 만들고자 한다면, 이 자체가 하나의 과제입니다. 네이버와 같은 포털에 형태소분석기만을 납품하는 회사가 있을 정도니까요.

검색엔진 기술은 구글수준의 품질을 요구한다고 봤을 때 이미 거의 완성단계에 이르렀습니다. 수행속도 부분을 제외하고 본다면, 구글과 공개검색엔진과 큰 차이가 나지 않는 수준이라고 볼 수 있습니다.
우선 공개검색엔진인 lucene&nutch쪽을 한번 보시기 바랍니다. 문서의 양이 크지 않다면, (좀 느리긴 해도) 꽤나 괜찮은 결과를 보여주는 검색시스템을 만들 수 있을 겁니다. 물론 한글문서의 경우 형태소 분석기가 붙어있지 않다면, 좀 문제가 있긴 하지만, 검색엔진 원론적인 기능으로 보자면 훌륭한 시스템의 구성이 가능합니다. 참고로 이들은 Java로 만들어졌습니다. lucene의 경우에는 C,C++로 만들어진 것들이 있지만, 분산처리를 맡고 있는 nutch쪽에는 마땅한 대안이 없습니다.

만약... 문서의 양을 천만단위로 늘리게 된다면, 분산시스템/분산처리라는 새로운 문제에 직면하게 될겁니다. 위에 소개한 nutch가 분산시스템 환경을 구현하고 있긴 하지만, 그대로 사용해서는 성능이 나오지 않기 때문에, 상당히 많은 튜닝과 서버구성에 있어서 기술적인 고민을 해야 합니다.

결론적으로 말하자면, 검색엔진은 게임과 마찬가지로 종합예술이라고 보시면 될거 같습니다. 시스템 운용, 시스템 프로그래밍 능력, 데이터 분석, 분산시스템/처리, 언어에 대한 능력, 네트워크에 대한 이해, 이 모두에 대해서 일정수준이상의 능력이 필요합니다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/JCvs/Search/Document 에 개인적으로 정리한 문서가 있으니 참고하시면 도움이 되리라 생각되네요.



Posted by BAGE