[ETC] Jakarta Lucene (루씬) - 들어가기

황제낙엽 2007.07.30 15:36 조회 수 : 57 추천:78

site_link1  
site_link2  
site_link3  
Lucene는 Jakarta 프로젝트에 의해서 개발된, 100% PureJava의 인덱스를 작성하는 타입의 풀텍스트 검색 엔진이다(인덱스란, 고속으로  검색하기 위해서 만든 색인을 말한다.).

[자세한 내용]
1997년쯤 Doug Cutting가 개발하여 2000에 SourceForge.net에 공개 되었다.
2001년에는 Apache Software Foundation에 이관된후 2005년부터 Apache의 톱 레벨 프로젝트로 승격되었다.
Lucene이라는 이름은 Cutting의 아내의 미들네임이며, 그녀의 외가, 조모의 퍼스트네임이다. 왜 아내의 이름을 붙였는지에 대해서는 확실치 않으나 Cutting의 아내가 물건을 찾는데 능숙했기때문이라는 유래만 있을 뿐이다.
 Lucene은 라이브러리(API)이며 완결한 프로그램이 아니다.
즉 Lucene만 설치한다고 프로그램을서의 기능을 할 수 없다는 뜻이다. Lucene에서 제공하는 API를 이용하여, 간단하게 사용하기 쉬운 풀텍스트 검색 프로그램을 만들 수 있다.
또 Java로 개발 되어 있기 때문에, Web 어플리케이션으로도 손 쉽게 적용 할 수 있다.
Lucene에서는 여러 분석 라이브러리를 제공하지만 한국어, 일본어, 중국어와 같은 아시아권의 언어를 정확히 해석하지는 못한다.
이는 언어 자체가 상당히 많은 변화를 하기 때문이다. 때문에 한국어 인덱싱이라던지 일본어 인덱싱에는 형태소 분석을 통한 색인 라이브러리를 만들어 사용 한다면 좀더 정확한 인덱싱을 할 수 있다.
형태소 분석이란 문자열을 품사마다 분해하는 기술이다.
형태소 분석을 통한 색인을 만드는것과 형태소 분석을 하지 않고 색일을 만드는것은 아래 예시와 같은 차이가 나타난다.
"오늘은 좋은 날씨입니다"
 위 예문을 Lucene에서 기본 제공하는 WhiteSpace(뛰어쓰기에 의한 분석)분석기를 이용하여 색인을 만든다면
[오늘은] [좋은] [날씨입니다]
  와 같이 3개의 인덱스가 생성될것이다.
이는 "오늘"이란 단어로 사용자가 검색을 시도했을경우 [오늘은]이란 색인과 매치하게 되지만 정확도는 떨어진다.
많은 검색엔진들이 사용자가 입력한 단어에 가장 정확한 단어가 있는 데이터를 보여주려고 노력하는데 수 많은 문서가 웹상에 있다고 생각한다면 위의 문장이 있는 문서는 찾기 힘들어 질 것이다.
반대로 형태소 분석을 통한 색인을 만든다면
[오늘] [은] [좋다] [날씨] [입니다]
  위와 같이 색인이 만들어 진다. 이는 위의 WhiteSpace분석기를 통해 만든 색인보다 좀더 한국어의 실정에 맞도록 색인이 만들어지며 검색을 요청한 사용자에게 좀더 정확한 검색 결과를 돌려 줄 수 있게 된다.
이는 문자열을 형태소로 분석하여 단어마다 색인을 붙인다면 어느 단어가 어느 문장에 몇 개 포함되는지, 어느 장소가 포함되는지에 대한 정보도 인덱스 할 수 있다는것을 의미한다.
또한 검색에 필요없는 "입니다"와 같은 조동사등을 제외하여 인덱스의 사이즈를 작게 유지 하는데도 도움을 줄 것이다.
문제점으로는 기본으로 제공되는 Lucene API로는 위와 같은 형태소 분석을 할 수 없다는 점이다.
그나마 아시아권에 가장 적합한 분석기로 CJK(Chinese Japanese Korean) Analyzer가 제공되고 있지만 이 역시 정확한 한국어 분석에는 그다지 도움이 되지는 않는다.
CJKAnalyzer는 중국어, 한국어, 일본어 분석을 위해 추가로 개발된 분석기로 문자열을 2문자씩 분해해서 인덱스에 등록한다.
예를 들면 위의 "오늘은 좋은 날씨입니다"를 CJKAnalyzer를 통해 분해 한다면
[오늘] [늘은] [은좋] [좋은] [은날] [날씨] [씨입] [입니] [니다]
 와 같이 분해하여 인덱싱을 한다.
분명 WhiteSpace Analyzer보다는 한국 유저에게 정확한 검색 결과를 제시해주겠지만 인덱스의 크기도 커질뿐더러 쓸데 없는 인덱스때문에  분명 검색에 방해가 될 것이다.
 앞으로 이런 Lucene의 성격을 이해하고 Lucene으로 색인 및 검색 프로그램을 개발하며 아시아권에 알맞는 색인에 대해서 연구해보겠다.

출처 :: http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=53114

이런 Lucene을 이용하여 검색 기능을 구현해보고 싶어졌다.
근데 그냥 Lucene이 좋다는 말에 혹해서 시작하는 거지만 DB검색에도 Lucene을 이용해야 할 이유가 먼지 궁금해졌다. (한참 공부하고 있는데 DB검색시엔 소용없어요... 라는 말을 들으면 얼마나 가슴이 아프겠는가...;;)
그래서 검색해보았는데, 다음 내용으로 안심하고 열심히 시간을 투자해보기로 마음먹었다. ( 출처 :: http://www.jakartaproject.com )

질문 : 현재는 오라클에서 DBMS_LOB.INSTR(컬럼, '검색어')구문을 사용해서 검색하고있는데..
          4600개정도의 글을 검색하려고하니, 검색되는시간만 약 5초정도가 걸리더군요..
          서버에 부하가 있는것도 아닌데.. 검색하는데 5초이상걸린다는건 말이안된다고생각되는데요..
          그래서 여쭤보고 싶은게..
          유니콘에서는 내용부분의 컬럼이 어떤 데이터형으로 되어있고,
          검색은 어떤식으로 구현하셨는지 궁긍하네요..
          그럼 수고하세요
답변 : 오라클의 단점중에 하나가 LIKE 풀검색 입니다
          아~주 쥐약입니다
          VARCHAR2검색도 느린데 CLOB검색은 더더욱 느릴겁니다
          저도 이문제를 해결하기 위해 열심히 알아봤는데 결론은 꽁수를 부리거나 기능상의 제약, 혹은 다른 솔루션을 사용하는 겁니다
          Unicorn에서 사용하는 방법은 LIKE 풀검색과 함께 Apache Lucene의 텍스트검색엔진을 제공합니다
          글작성이나 수정, 삭제등을 하면 텍스트 기반 INDEX가 따로 생성되어 이를 통해 검색을 하게 됩니다
          속도는 100만건정도 되더라도 1초 안에 검색됩니다
          Unicorn3 소스를 참고하시면 됩니다