1. 개 요
검색 엔진 개발에 앞서 검색 엔진의 작동원리 및 Open Source인 Lucene의 기능을 검토하여 적용 가능성 여부와 기능을 파악하고 앞으로의 개발 방향에 대하여 정리한다.
2. 검색 엔진의 작동 원리
1) Crawler의 정보 수집
- 스파이더(spider) 혹은 크롤러(crawler)라고 불리는 로봇이 웹에 있는 웹 페이지를 방문해서 모든 내용을 읽어온다. 이 때 그 페이지만 방문하고 마는 것이 아니라 그 페이지에 링크되어 있는 또 다른 페이지를 차례대로 방문한다.
- DB에 수집해온 그대로 저장하는 것이 아니라 검색에 적합하도록 일정한 가공을 거친다. DB에 저장되는 내용에는 문서의 제목, 본문, 링크 그리고 문서가 웹에서 차지하는 중요도 등이 있다.
2) 수집한 문서 가공과 색인 작업
- 검색엔진에서 가장 중요한 부분으로써 좋은 검색엔진을 만들기 위해 핵심이 되는 부분이다.
- 한글문서를 색인하고자 할 경우 얼마나 좋은 형태소 분석기를 가지고 있느냐가 색인 DB의 품질을 결정하게 된다.
- 먼저 수집된 문서를 적절하게 형태소 분석을 통하여 단어로 쪼갠다.
- 검색어의 빈도수와 위치(제목, 본문)등을 고려하여 중요도를 계산하여 이를 반영한다.
3) 정보 검색기
- 사용자가 입력한 검색어를 색인기에 넣어 색인어를 추출하고 그것을 사용하여 검색을 한다.
3. Lucene
1) Lucene 소개
- 아파치 최상위 Project중에 하나로 http://lucene.apache.org에서 접할 수 있다.
- Lucene은 강력한 기능뿐만 아니라 간단하기 때문에 IT업계에서 많이 사용된다.
- 루씬은 확장 가능한 고성능 정보검색(IR, Information Retrieval) 라이브러리이다. 루씬은 소프트웨어 프로그램에 색인과 검색 기능을 간단하게 추가할 수 있도록 지원한다.
- 루씬을 사용할 때 검색에 대한 전문적인 지식을 반드시 알 필요는 없다. 꼭 필요한 몇 가지 기본 클래스들을 사용하는 방법만 익히면 색인과 검색 기능을 직접 추가할 수 있다.
- 루씬은 독립 프로그램이 아닌 단순한 소프트웨어 라이브러리이다.
- 루씬은 프로그램에 텍스트 색인과 검색 기능을 추가할 수 있도록 지원한다.
2) Doug Cutting(루씬의 창시자)이 제시한 lucene의 인덱싱과 검색을 적용 가능한 사례들
- 이메일 검색 : 저장된 메시지를 검색할 수 있고 새로 도착한 메시지를 색인에 추가할 수 있는 이메일 어플리 케이션
- 온라인 문서 검색 : 온라인 문서 또는 저장된 출판물을 검색할 수 있는 CD기반이나 웹 기반 또는 어플리케이션에 포함된 문서 판독기
- 웹 페이지 검색 : 사용자가 방문한 모든 웹 페이지를 색인화하기 위해 개인 검색 엔진을 만들 수 있는 웹 브라우저 또는 프록시 서버.
- 내용 검색 : 저장된 문서에서 특정 내용을 검색할 수 있는 애플리케이션.
- 버전 관리 및 컨텐트 관리 : 문서나 문서 버전을 색인화해서 쉽게 검색할 수 있는 문서 관리 시스템.
- 뉴스 및 유선(wire) 서비스 : 뉴스가 도착했을 때 기사를 색인할 수 있는 뉴스 서버나 릴레이 서버.
☞ Lucene을 사용하여 개발할 수 있다는 의미임. 각각에 대한 전용 라이브러리를 지원한다는 의미가 아님.
3) Lucene을 사용했을 때의 모형도
- 빨간 점선을 기준으로 아래 부분이 루씬으로 할 수 있는 일들이고 위의 부분이 별도로 구연해야 할 부분이다.
4) Lucene의 기능
- 색인을 저장할 수 있는 곳
n RAMDirectory : 컴퓨터의 메인 메모리를 색인 장소로 사용
n FSDirectory : 디스크의 파일 시스템에 색인을 저장 (가장 많이 사용)
n JDBCDirectory : DB를 색인 저장소로 사용하는 방법. 일반적으로 지원하지는 않지만 별도의 루씬 샌드박스라는 것을 통해 지원한다.
- 색인 기능 지원
- 검색 기능 지원
- 다양한 나라의 Full Text분석기(Analyzer) 지원(한글x)
- Hadoop을 분산 파일 시스템으로 사용할 수 있음. (Nutch에서 사용중, Yahoo에서도 사용)
5) Lucene은 Full Text 검색 엔진
- 실전에서는 단순한 문자열을 색인하는 것 보다는 다양한 문서를 색인화 하고 검색하는 작업이 더 빈번 할 것이다.
- 루씬을 이용해서 임의의 바이너리 파일을 직접 색인하고 검색할 수 없으며, 모두 문자열 형태로 변경된 이후에야 루씬으로 색인하고 검색할 수 있다.
- XML, PDF, HTML, MS WORD와 같이 다양한 문서들을 색인화 하기 위해서는 각각의 문서를 Lucene의 Analyzer가 이해할 수 있도록 해석(parse)해서 텍스트로 추출해 내는 과정이 필요하다.
- Parser를 지원하는 사이트
XML | Dom, Sax, JDom, Piccolo (http://piccolo.sourceforge.net) Apache Disester (http://jakarta.apache.org/commons/digester/) |
PDFBox (http://www.pdfbox.org), IndexFiles (lucene built-in) , LucenePDFDocument (lucene built-in) Xpdf (http://www.foolabs.com/xpdf) JPedal (http://www.jpedal.org) Etymon PJ( http://www.etymon.com) | |
Html | Jtidy (http://jtidy.sourceforge.net ), HTMLParser( http://htmlparser.sourceforge.net) |
MS Word | POI (http://jakarta.apache.org/poi ) Text Extractors( http://textmining.org ) Antiword ( http://www.winfield.demon.nl) OpenOffice SDK ( http://www.openoffice.org ) |
6) 사용 가능한 언어
- 원래 자바로 만들어진 루씬은 펄(Perl)에서 시작해 파이썬(Python), C++와 닷넷(.NET)등의 언어로 포팅돼있고, 루비(Ruby)로 포팅하기 위한 작업도 진행중이다.
- 루씬은 서로 다른 언어간에도 색인 데이터를 100% 호환해서 사용할 수 있도록 설계되어있다.
4. Nutch
1) Nutch 소개
- 광고로 뒤덮인 인터넷 검색 사이트에서 상업적인 요소를 배제하고 검색 그 자체로의 검색을 구성하고자 진행된 오픈 소스 인터넷 웹 검색엔진 프로젝트
- 루씬을 이용하여 색인과 검색을 한다.
- 너치는 수 억개 이상의 웹페이지를 긁어 모아 색인하고 검색해볼 수 있게 해준다.
- 너치 시스템은 웹에 존재하는 문서(대략 10억에서 100억 개 정도)를 처리할 수 있도록 만들어졌고, 물론 문서가 아주 많기 때문에 1대보다는 여러 대의 서버에서 색인과 검색을 동시에 가동해야 한다.
2) Nutch의 검색 구조
- 웹 서버가 사용자의 검색 요청을 받는다.
- 질의 핸들러가 검색어를 가공해서 다수의 색인 검색 서버로 전달한다.
- 질의 핸들러가 넘긴 검색어에 대해 여러 개의 색인 서버에서 결과가 나오는데 이 결과를 가장 점수가 높은 순서로 정렬한다.
- 만약 1~2초가 지난 후에 결과를 알려주지 않는 새인 서버가 있다면 결과에 포함하지 않고 무시한다. (사용자가 느끼기에2초안에 결과가 나오도록 보장)
3) Nutch테스트
- Crawling : http://www.hufs.ac.kr
- 검색어 : hufs
5. Lucene으로 할 수 있는 일
- 내용을 검색하는 모든 분야에 Lucene을 적용할 수 있다.(우리는 Text와 Analyzer를 Lucene에 제시하면 Lucene이Index를 구성해 준다. Lucene의 api를 사용해서 검색할 수 있다)
- 대표적으로 Desktop 검색, E-mail 검색, 웹 페이지 검색
- 문제점 : 내용을 단어로 쪼개는 방법을 구현 해야함(형태소 분석기). 간단한 형태소 분석기는 “루씬 인 액션” 책에서 소스를 공개하고 있음. 하지만 고급 형태소 분석기는 국어에 대한 이해를 기반으로 구현하는 것이 매우 어렵다고 한다.
6. 결론
- Lucene은 Full Text를 검색하는데 효율적이다.
- Full-Text(Contents)와 text를 단어로 쪼개는 방법(Analyzer)을 제시하면 알아서 Index를 구성해 주고 그것으로 빠른 검색 결과를 얻을 수 있다.
- 그러므로 내용검색을 위해서는 Lucene을 사용하면 효율적이지만 단지 Exact Match 검색을 한다면 Lucene은 불필요하다.
출처 - http://cherrykyun.tistory.com/148
'OpenSource > Common' 카테고리의 다른 글
OSGi - 서비스 개념 (0) | 2012.10.08 |
---|---|
OSGi - “Getting started with OSGi”의 번역 (0) | 2012.10.08 |
MINA 소개 (0) | 2012.09.20 |
redis - redis 소개 (0) | 2012.09.14 |
FOSS(Free and Open Source Software) (0) | 2012.04.28 |