

오픈소스 검색엔진인
Lucene
엔터프라이즈 검색서버인
Solr 오픈소스 검색엔진인
Lucene 과 그의 서브 프로젝트로서 엔터프라이즈 검색서버인
Solr 를 활용하여,
Twicco 서비스의 검색 기능을 개선하게 되었다.

처음에는 Twicco를 오픈 하였을 때는 트위터 글이 적어서 데이터베이스의 like 검색으로 가능 할 줄 알았다.
그런데, 몇만건 이상의 트위팅 글이 쌓이면서, DB like 검색은 수십초가 넘게 걸리는 문제가 발생했다.
이뿐만 아니라, 쇼핑몰을 만들어도 쇼핑 아이템 수가 늘어나면 검색 기능이 필요해 지고,
Stackoverflow와 같은 Q&A 커뮤니티 서비스를 만들어도 검색 기능은 빠질 수 없는 필수 기능이다.
그리고, DB like검색으로는 해결이 안되는 용량의 수준은 어느 서비스에서나 겪을 수 있는 문제라고 생각된다.
그래서, 이번 기회에 기존에 들어봤던 오픈소스 검색엔진인 Lucene 을 적용해 보기로 했다.
(회사에서 검색 부서 옆에서 일하면서도, 검색을 잘 모르지만... )
예전에 검색 교육을 받았던 문서도 뒤져보고, 웹서핑을 하면서 검색의 기초 개념을 조금 익혔다.
예전부터 거론된 Lucene을 사용하기에 가장 문제가 되는 점은..
한글 형태소 분석기가 없다는 것이다.
이 말은 쉽게 표현하자면,
"톱스타 장동건이 연인 고소영을 위해 담배를 끊었다고 일간스포츠가 7일 보도했다."
라는 문장을 검색 할 때,
Lucene에 기본으로 포함되어 있는 형태소 분석기를 이용하게 되면 스페이스 기준으로
Term을 구분하고 indexing하게 되어,
"장동건이" 를 치면 검색이 되지만, "장동건" 을 치면 검색이 되지 않는 치명적인 문제가 있다.
"담배를" 을 검색하면 검색이 되고, "담배" 를 검색하면 검색이 되지 않는..
얼마나 치명적인 문제점인가!
이 문제를 오픈소스로 해결해 주신 멋진, 존경스러운 분이 계셨다.
네이버에 루씬 한글 분석기 오픈소스 프로젝트 까페(
http://cafe.naver.com/korlucene )
에 가면 KoreanAnalyzer 를 다운로드 받을 수 있다.
검색을 위한 형태소 분석 면에서 영어에 비해서 한글은 훨씬 어려운 점을 가지고 있다.
잘은 모르지만, 우리나라에서 한글 검색기술은 잘 오픈되지 않았던 것 같다.
그래서, 더 갑진 듯 하다. 이 한글 형태소 분석기를 개발해 주신분께 다시한번 감사의 말씀을 전한다.
KoreanAnalyzer를 활용하여 Lucene 커멘드 명령어로 한글 검색을 해 보니,
한글의 조사, 어미, 접두어, 접미어, 조합어 등의 사전을 기반으로 하기 때문에,
Lucene의 기본 형태소 분석기와는 차원이 다르게 훌륭한 결과를 얻을 수 있었다.
그리고, 기본 사전을 추가, 변경하면서 검색 성능을 향상 시킬 수도 있다.
위 문장에서 예를 들었던 "장동건", "담배" 등이 검색이 잘 된다.
2단계 Apache Solr.
검색 결과를 어플리케이션으로 전달하기 위해서는 많은 작업을 해 줘야 한다.
보통 아래와 같은 XML로 검색결과를 전달하는 방법이 많이 사용하는 것 같다.

검색 대상 도큐먼트 추가, 색인 데이터 관리, 검색 결과를 전달 하는 등의 동작을
HTTP XML RESTful 방식으로 사용할 수 있게 해 주는 것이
Solr 이다.
아래와 같은 웹 인터페이스로 질의 테스트 및 색인어 보기 등의 많은 기능을 제공하여 편하게 사용할 수 있다.
Solr를 사용하기 위해서는 위에서 언급했던 KoreanFilter, KoreanTokenizer 의 Factory 클래스를 아래와 같이 만들어 줘야 한다. 이것은 Solr의 설정을 통해 Lucene의 에서 사용된다.
package org.apache.lucene.analysis.kr;
import org.apache.lucene.analysis.TokenStream;
import org.apache.solr.analysis.BaseTokenFilterFactory;
public class KoreanFilterFactory extends BaseTokenFilterFactory {
public TokenStream create(TokenStream input) {
return new KoreanFilter(input);
}
}
package org.apache.lucene.analysis.kr;
import java.io.Reader;
import org.apache.lucene.analysis.TokenStream;
import org.apache.solr.analysis.BaseTokenizerFactory;
public class KoreanTokenizerFactory extends BaseTokenizerFactory {
public TokenStream create(Reader input) {
return new KoreanTokenizer(input);
}
}
그리고, Solr 홈페이지에 있는 Getting Started (Tutorial)
http://lucene.apache.org/solr/tutorial.html 을 보고 설치하면 된다.
설정하는 과정에서 schema.xml 파일의 설정을 보면
<fieldType> 의 <analyzer>부분을 아래와 같이 수정한다.
...
<analyzer type="index">
<!-- modified by jaehyun
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
-->
<tokenizer class="org.apache.lucene.analysis.kr.KoreanTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.kr.KoreanFilterFactory"/>
...
<analyzer type="query">
<!-- modified by jaehyun
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
-->
<tokenizer class="org.apache.lucene.analysis.kr.KoreanTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.kr.KoreanFilterFactory"/>
...
그리고 검색할 데이터의 형태에 맞게 field를 정의해야 한다.
이것은 마치 DB설계를 할 때, 테이블 설계와 유사한 형태라고 생각하면 된다.
그리고 몇가지 설정해야 할 것들이 더 있는데, 아래 문서를 보면서 따라하면 쉽게 될 것으로
생각되어 모두 기술하지는 않겠다. 자세한 사항은
http://lucene.apache.org/solr/tutorial.htmlhttp://www.ibm.com/developerworks/kr/library/tutorial/os-dw-os-apachelucene.htmlhttp://wiki.apache.org/solr/http://gurchin.tistory.com/153등의 문서를 참고 하면 된다.
Tomcat을 같이 사용하려면
http://wiki.apache.org/solr/SolrTomcat 을 보면 된다.
끝으로..
지금까지는 검색엔진 기술은 전공자가 아니면 쉽게 따라할 수 없는 기술로 여겨져 왔으나,
훌륭한 오픈소스인 Apache Lucene, Solr, KoreanAnalyzer 등을 이용하면, 누구나 기초적인 텍스트 검색엔진 구축하여 활용 할 수 있게 되었다.
이제 막 기초적인 설정을 마무리 하였으니, 앞으로 Lucene, Solr 를 좀 더 공부해 봐야겠다.