본문 바로가기

IT-Consultant

검색 엔진을 만들어 보자, Nutch


사용자가 간단하게 검색 엔진을 만들 수 있는 오픈소스 도구로 Nutch가 있다.
Nutch는 Apache Lucene 인덱싱 API 위에서 동작하는데, Lucene을 편하게 쓸 수 있도록 여러 가지 도구를 추가해서 사용자가 쉽게 검색엔진을 만들 수 있게 해 준다.

Nutch에 대한 전반적인 내용 여기 에서 볼 수 있다.

글을 쓰는 지금 안정적인 릴리즈는 0.8.x 이므로, 0.8.x를 어떻게 쓰는지 살펴 보자.

간단하게 한글로 설명하지만, 여기에 있는 내용은 Nutch 0.8.x Tutorial 을 기반으로 하고 있다.

Requirements

  1. Java 1.4.x, either from Sun or IBM on Linux is preferred. Set NUTCH_JAVA_HOME to the root of your JVM installation.
  2. Apache's Tomcat 4.x.
  3. On Win32, cygwin, for shell support. (If you plan to use Subversion on Win32, be sure to select the subversion package when you install, in the "Devel" category.)
  4. Up to a gigabyte of free disk space, a high-speed connection, and an hour or so.
우선 자바 1.4 이상, 톰캣 4.x 이상이 필요하다. 쉘을 제공하지 않는 윈도우에서는 cygwin을 이용해서 쉘을 사용할 수 있다. cygwin은 사실 영 번거로워서 별로 추천하고 싶지 않다. 차라리 vmware같은 가상 PC도구를 이용해서 리눅스를 설치 하는 것을 추천 한다.

Getting Started

First, you need to get a copy of the Nutch code. You can download a release from http://lucene.apache.org/nutch/release/. Unpack the release and connect to its top-level directory. Or, check out the latest source code from subversion and build it with Ant.

Try the following command:

bin/nutch

This will display the documentation for the Nutch command script.

Now we're ready to crawl. There are two approaches to crawling:

  1. Intranet crawling, with the crawl command.
  2. Whole-web crawling, with much greater control, using the lower level inject, generate, fetch and updatedb commands.
시작하기에 앞서, Nutch를 다운로드 받아서 압축을 풀어야 한다. 다운로드는 http://lucene.apache.org/nutch/release/에서 받을수 있다. 압축을 푸는것 만으로도 실행할수 있다. 최근의 코드를 사용하려면 Ant를 쓰면 된다. Ant사용 방법은 다른 문서들을 참조 하시길.


쉘에서 bin/nutch를 치면 사용법이 나온다.필자가 사용하는 환경에서는 다음과 같은 화면이 나온다.


Nutch를 이용해서 crawling을할 때는두 가지 접근법이 있는데, 하나는 crawl 명령어를 이용한 인트라넷 crawling이고 (특정 사이트만 crawling함) 하나는 inject, generate, fetch, updatedb 명령어를 이용해 하위 단계에서 전체 웹을 crawling하는 방법이다.

인트라넷 crawling 하기 : 설정 편
crawl 명령어를 이용해 인트라넷 crawling을해 보자.

Create a directory with a flat file of root urls. For example, to crawl the nutch site you might start with a file named urls/nutch containing the url of just the Nutch home page. All other Nutch pages should be reachable from this page. The urls/nutch file would thus contain:
http://lucene.apache.org/nutch/
디렉토리를 하나 만들고, 루트 url을 포함하는 텍스트 파일을 만든다. 튜토리얼에서는 예시로 urls 라는 디렉토리에 nutch라는 파일을 만들었다.
nutch 라는 파일은 http://lucene.apache.org/nutch/ 이라는 URL을 가지고 있는데, 이 주소가 우리가 crawling할 루트 URL이다 crawling할 모든 페이지는 이 페이지로부터 접근 가능해야 한다.

Edit the file conf/crawl-urlfilter.txt and replace MY.DOMAIN.NAME with the name of the domain you wish to crawl. For example, if you wished to limit the crawl to the apache.org domain, the line should read:
+^http://([a-z0-9]*\.)*apache.org/
This will include any url in the domain apache.org.
conf/crawl-urlfilter.txt 라는 파일을 열어 MY.DOMAIN.NAME 을 crawling할 URL로 바꾼다. 이 곳에서는 crawler가 crawl할 URL을 정규식에 따라 제한한다.
예시에서는 +^http://([a-z0-9]*\.)*apache.org/ 정규식에 걸리는 URL만 crawling한다.

Edit the file conf/nutch-site.xml, insert at minimum following properties into it and edit in proper values for the properties:
<property>
<name>http.agent.name</name>
<value></value>
<description>HTTP 'User-Agent' request header. MUST NOT be empty -
please set this to a single word uniquely related to your organization.

NOTE: You should also check other related properties:

http.robots.agents
http.agent.description
http.agent.url
http.agent.email
http.agent.version

and set their values appropriately.

</description>
</property>

<property>
<name>http.agent.description</name>
<value></value>
<description>Further description of our bot- this text is used in
the User-Agent header. It appears in parenthesis after the agent name.
</description>
</property>

<property>
<name>http.agent.url</name>
<value></value>
<description>A URL to advertise in the User-Agent header. This will
appear in parenthesis after the agent name. Custom dictates that this
should be a URL of a page explaining the purpose and behavior of this
crawler.
</description>
</property>

<property>
<name>http.agent.email</name>
<value></value>
<description>An email address to advertise in the HTTP 'From' request
header and User-Agent header. A good practice is to mangle this
address (e.g. 'info at example dot com') to avoid spamming.
</description>
</property>
conf/nutch-site.xml 파일을 열어서 위의 기본 정보를 넣어준다. 주의해야 할 점은, value를 비워두지 말라. 비워두면 에러가 발생한다. 필자는 이 것 때문에 며칠간 고생한 적이 있다. 적당한 값을 넣어 주면 된다.

인트라넷 crawling 하기 : 실행 편

Once things are configured, running the crawl is easy. Just use the crawl command. Its options include:

  • -dir dir names the directory to put the crawl in.
  • -threads threads determines the number of threads that will fetch in parallel.
  • -depth depth indicates the link depth from the root page that should be crawled.
  • -topN N determines the maximum number of pages that will be retrieved at each level up to the depth.

For example, a typical call might be:

bin/nutch crawl urls -dir crawl -depth 3 -topN 50

Typically one starts testing one's configuration by crawling at shallow depths, sharply limiting the number of pages fetched at each level (-topN), and watching the output to check that desired pages are fetched and undesirable pages are not. Once one is confident of the configuration, then an appropriate depth for a full crawl is around 10. The number of pages per level (-topN) for a full crawl can be from tens of thousands to millions, depending on your resources.

Once crawling has completed, one can skip to the Searching section below.


설정이 끝난 후, 실행 하는 것은 단순히 crawl 명령어를 쓰기만 하면 된다. 예시에서는
bin/nuch crawl urls -dir crawl -depth 3 - topN 50
urls 디렉토리에서 정해놓은 URL에서 (설정 편에서 만든 디렉토리를 넣으면 된다)
-dir crawl 결과를 crawl 디렉토리에 넣고
-depth 3 루트 페이지로부터 들어 갈 링크의 깊이는 3
-topN 50 각각의 레벨에서 가지고 올 페이지의 개수는 50개. (그렇다면, 총 가지고 오는 페이지의 개수는 3*50=150개? -확실하지 않습니다-)

다음은 검색으로 넘어 가 봅시다. 전체 웹에서 crawling하는건 패스 하겠습니다. 그리고 (만들다 귀찮아서) 검색에 대해선 나중에 업데이트 하겠습니다.

Nutch 튜토리얼에 가시면 상세하게 설명 되어 있습니다. 시키는 대로만 잘 하면 됩니다 =)