Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

소개

검색엔진의 이론적 기본은 이미 5년전전에 완성되었으며, 발표된 이론을 거의 대부분 수용하고 있는 lucene 검색엔진까지 개발된 상태다. 현재로써는 새로운 검색엔진의 개발이라는 목표를 세울 필요도 없다. 몇가지 할일이라고는 검색을 최적화 하기 위해서 몇몇 수식을 약간씩 고치는 정도이겠지만 별 의미 없는 일이라고 생각된다. 그거 약간 고친다고 해서 성능이 대폭향상되거나 하는 일은 없을 거라 생각된다.

약간의 프로그래밍및 시스템 관리 능력만 가지고 있다면 일주일 정도 학습하는 것으로 쓸만한 검색엔진을 구축할 수 있을 정도다.

검색엔진의 모든 틀이 완성된 지금 시점에서는 어떤 서비스를 개발할 것인가 하는게 남은 과제라고 할 수 있다. 구글의 adsense(:12)라든지, 추천, 블러그 위키등의 컨텐츠 특화된 검색서비스 등이 될 것이다.

이러한 검색 서비스의 개발에 있어서 가장 중요한 점은 잘 갖추어진 테스트 환경이라고 생각된다. 검색 결과를 확인하기 위해서 항상 특정 사이트의 내용을 crawling 해오는 것도 문제일 뿐더러, 이렇게 사이트의 내용을 임으로 crawling한후 색인 해서 데이터를 입력할 경우 나중에 검색엔진을 돌렸을 때 원하는 결과가 나왔는지를 역으로 추적하는 과정이 대단히 어려울 수 있기 때문이다.

여기에서는 lucene 검색엔진을 위한 테스트환경을 만드는 법에 대해서 소개할 것이다.

개발 서비스

우선 블러그를 위한 단순 검색엔진은 루신을 최적화 하는 정도로 구축할 수 있을 것이다. 대량의 블러그 데이터를 검색해야 한다면, 분산컴퓨팅 환경을 만들어야 되며 이경우 nutch의 hadoop과 MapReduce를 이용하면 된다. 즉 마음만 먹으면 누구든(비록 쉽지는 않겠지만) 검색환경은 만들 수 있다. 이 정도를 가지고는 검색시장에서 살아남을 수 없을 것이다. 결국 부가 서비스를 개발해야 한다.

개발하고자 하는 서비스는 블러그 추천 서비스다. 이 서비스는 블러그 서비스를 이용하는 고객이 다음과 같은 성향을 가지고 있을 것이라는 가정하에 만들어 진다.
  1. 블러거 A는 자신의 특정 관심영역(영화)를 컨텐츠화 한다.
  2. 블러거 A는 아마도 영화와 관련된 컨텐츠를 자주 보게 될 것이다.
  3. 블러거 A의 문서를 자주열람하는 블러거 B는 블러거 A와 비슷한 관심을 가지고 있을 거라고 예상할 수 있다.
  4. 그렇다면 블러거 A의 방문기록을 Counting해서 자주 열람했던 문서에 대한 정보를 블러거 B에게 추천할 수 있을 것이다.
전체적으로 Google의 adsense와 비슷한 개념의 서비스라고 볼 수 있다. Google은 검색엔진이 아닌 부가서비스라고 할 수 있는 adsense에서 90%이상의 매출을 올리고 있다.

crawling

테스트 할 때마다 특정 사이트의 문서를 crawling 하는 건 문제가 있다. 일단 많은 시간이 걸릴 뿐더러, 사이트의 특성에 따라서 원하는 문서를 수집할 수 있다는 걸 보장할 수 없기 때문이다. 문서를 제어할 수 없다는 게 문제다.

그래서 임의의 문서를 생성하기로 했다. 그렇다고 해서 단어를 랜덤조합하는 형식으로는 제대로된 테스트 환경을 구축할 수가 없다. 이문제는 다음과 같은 방식으로 해결했다.
  1. 신문사이트에서 특정 섹션의 문서 1000개를 얻어온다.
    • 신문 기사들의 URL은 일정한 패턴을 가지고 있으므로 그리 어렵지 않다.
    • wget과 shell script를 이용하면 쉽게 수집이 가능하다.
  2. 본문기사와 타이틀 외에 쓸모 없는 부분을 제거한다.
  3. 1000개의 문서를 랜덤 조합해서 10000개를 만든다.
<!> 최종적으로 100000개의 검색가능한 문서를 만든다. <!> 이 문서는 루신 새인기를 돌려서, 검색가능하도록 색인을 할 것이다.

아래와 같은 간단한 스크립트를 이용해서 문서를 수집했다.
#!/bin/bash
STARTNUM=0
LIMIT=10000

while [ "$STARTNUM" -lt "$LIMIT" ]
do
	wget "http://www.111.com/list/base.html?code=article&page=$STARTNUM" -O $STARTNUM.doc
	STARTNUM=`expr $STARTNUM + 1`
done
수집된 문서는 랜덤으로 3개씩 추출해서 하나의 문서로 만들고, 반복작업을 통해서 100000개의 문서를 만든다. 간단한 C프로그램을 하나 작성해서 해결할 수 있다.

Blog 로그 생성

<!> 100만개의 로그 생성을 목표로 한다. 로그포맷을 만들고 거기에 따라서 랜덤 하게 100만개를 돌리면 될거라고 생각할 수 있지만, 그래서는 테스트 환경을 구축할 수가 없다. 인기있는 Post와 그렇지 않은 Post가 분명히 존재할 것이기 때문이다. 때문에 sqrt나 log등을 이용해서 비슷하게 시뮬레이션 해야 한다.

생성된 10만개의 파일이 1-100000번까지의 번호를 가지고 있다고 가정할 때, 각각의 파일(포스트문서)에 대해서 다음과 같은 갯수의 로그를 생성시키도록 했다.
for (i = 0; i < 100000; i++)
{
	total += (float)sqrt(i)/(float)100;
}
위와 같이 하면 total이 약 23만개가 나온다. 원하는 로그는 1000000이므로 x4 정도를 해서 값을 교정했다.
float seed = (float)1000000/(float)total; 
for (i = 0; i < 100000; i++)
{
	countlist.push_back((float)sqrt(i)*seed/(float)100);
}
이제 각 문서당 포스팅 갯수가 대략 정해졌으니 다시 루프를 돌면서 횟수만큼의 로그를 생성하면 된다.
for (i = 0; i < countlist.size(); i++)
{
	for(j = 0; j < countlist[i].size(); j++)
	{
		// 문서에 대한 로그 생성
	}
}
새부적으로 신경서야 할 것들이 몇개 더 있겠지만, 이러한 과정을 거쳐서 필요한 로그를 만들어낼 수 있을 것이다. 더 필요한 부분은 다음과 같다.
  • Post Url와 일련번호로된 문서를 맵핑시키기 위한 데이터 파일
이러한 부분은 알아서 해결하기 바란다.

attachment:fishlog.gif

crawl된 문서의 색인화

가상의 환경을 만들어서 crawl문서를 긁어왔다. 그렇다면 이것을 lucene에서 읽어들일 수 있드록 색인화하고 nutch의 분산파일 시스템에 올려야 할 것이다. 이건 다음 기회에 :-)