루씬이란 무엇인가? 에서 부터 시작을 해봐야 할 것 같습니다.
루씬은 full text 검색엔진을 만들 수 있는
라이브러리를 제공합니다.

검색엔진이라고 하면
키워드분석 / 색인 / 검색의 과정을 수행하는 것으로
크게 나눠 볼 수 있겠는데, 이런 과정들을 실제로 구현 할 수 있는
API를 제공합니다.

우선 루씬을 사용해서
색인과 검색이 어떠한 방식으로 이루어지는지
예제를 보는 것이 가장 손쉽게 루씬에 대해서 알아 볼 수 있는 방법이 
될 것 같습니다.

이 예제들은 파일들로부터 내용을 색인하고
그 색인 파일을 사용하여 키워드로 내용을 검색하는 예제입니다.

굉장히 간단한 예제이지만
사실 검색엔진을 구현하는데 있어서 가장 필수적인
내용들은 거의 다 들어가 있다고 보셔도 됩니다.

그만큼 이 루씬이라는 라이브러리가 잘 만들어져 있다는
이야기도 되겠네요. 물론 스코어의 세부적인 컨트롤, 리플리케이션, 하이라이트등의
고급 기능은 포함되어 있지 않습니다.

사실 이번에 소개해드릴 데모 프로그램은 루씬 패키지를 다운 받으면 
보실 수 있는 데모 프로그램입니다. 
이 프로그램을 불필요한 내용들은  제거하여 다시 보여드리려고 합니다.

원 소스에 있던 주석들에도 좋은 이야기가 많기 때문에
원 주석은 그대로 두고
몇몇 부분의 주석을 더 하고 Line 단위로 
설명을 조금씩 붙여보려고 합니다.

간단하게 공유 할 용어들을 확인해보겠습니다.

색인과 검색은 다 아실거라 생각하고 색인의 대상이 되는 RawData..
이 RawData를 일반적으로 문서(Document)라고 부릅니다.
아마도, 검색이라는 것이 문서를 찾기 위해 발전된 기술이라서 그런 것이 아닐까 싶네요.

루씬에서도 색인을 하기 위해서 사용되는 클래스가 Document라는 이름으로
설계가 되어있습니다.

Document들이 색인되어 있는 것을 인덱스파일이라고 하며, 이 인덱스 파일에서
문서를 찾는 과정을 검색이라고 합니다. 그리고 검색된 Document들을 나열하는 것을
Ranking(혹은 Sort)... 이 Ranking에 사용되는 점수를 Score라고 합니다.

마찬가지로 루씬에서는 Sort, Score라는 이름이 사용되고 있습니다.


우선 색인 예제를 보시겠습니다.

색인 예제는 파일로부터 파일의 내용을 읽어서
이를 색인하는 예제입니다. 파일 그 자체를 Stream으로 읽어들이기 때문에
가급적이면 색인 대상 파일들이 txt파일등 일반 텍스트 문서로 되어 있으면 나중에
SearchFiles 데모에서 확인이 쉬울 것 입니다.

 
IndexFiles

내용 자체는 주석의 숫자를 순서대로 따라가시면 됩니다.
가장 기본적으로 색인 대상을 설정하고 색인 파일이 위치 할 곳을 지정합니다.

그리고 IndexWriter를 생성하여 
색인 대상으로부터 원문을 읽어 색인을 합니다.
이 과정에서 원문에서 키워드를 추출하기 원문분석을 해야하는데
이때 사용되는 것이 Analyzer입니다. 여기서는 StandardAnalyzer가 사용되었습니다.

각각의 Analyzer에 대해서는 나중에 자세히 살펴보려 합니다.

실제로 한국어에 맞는 형태소 분석을 하고 싶으면
Analyzer를 구현해야 합니다.

그리고 분석된 키워드를 바탕으로 색인을 하게 되는데 이때 사용 되는 것이
DocumentField 클래스입니다. 여기서는 하나의 파일이 하나의 Document가 됩니다.
필드는 원문내용과 최종수정일을 필드로 가져가게 되고요..

Document도 여러가지 설정이 존재하는데 이 부분 역시 IndexWrtier에 대한 이야기를
할 때 자세하게 작성해보도록 하겠습니다.

위 예제에서는 d:/의 파일들을 대상으로 확장자가 txt인 파일들만
색인을 하도록 되어있습니다.

그러면 검색은 어떻게 할까요?

 
SearchFiles

검색을 하기 위해서는 일단 색인 파일이 위치한 곳의 경로를 지정하고
이를 이용하여 IndexSearcher를 생성합니다. 그리고 검색어를 분석 할 Analyzer를 사용하여
검색어를 분석 후 루씬에서 사용 가능한 쿼리로 변환합니다.

이때 검색어 분석에 사용되는 것이 Analyzer이며, 쿼리를 만드는 것이 QueryParser
그렇게 나온 쿼리가 Query 클래스입니다.

각각에 대해서도 해야 할 이야기가 굉장히 많지만
우선 간단한 데모를 보는 것이 목적이기 때문에 자세한 이야기는 나중으로 
미루겠습니다.

위 예제에서는 색인된 파일을 대상으로
contents필드에 "eclipse"라는 키워드가 들어있는 파일을 검색하게 됩니다.

결과는 최종적으로 ScoreDoc이라는 타입으로 받아 올 수 있으며
ScoreDoc으로부터 Document를 받아 올 수도 있습니다.

검색 된 문서의 TF-IDF 점수를 볼 수도 있는 것을
예제를 통해 아실 수 있을 것 입니다.

이 예제가 루씬 색인/검색에 대한
핵심적인 예제입니다.

앞으로는 이 내용을 바탕으로 앞에서 언급된 중요 클래스들에 대해서
상세하게 알아보도록 하겠습니다.

앞으로 사용된 예제들은 
https://github.com/need4spd/aboutLucene을 통해서
공유하도록 하겠습니다. 위 예제들은 이미 올라가 있는 상태입니다.


수정
 - indexWriter의 updateDocument 메서드는 2.X 버전부터 있던 메서드입니다. 잘못된 내용을 알려주신 이문호님의 말씀에 의하면 "주어진 텀이 포함된 기존 문서들을 일괄 삭제한 후, 딱 하나의 새로운 문서를 추가하는 메서드입니다." 라고 하네요 ^^
그 이전 버전에서는 delete와 insert를 사용하여 직접 구현하는 방식을 사용해야 합니다. 

지적해주신 이문호님께 감사드립니다.
 


 


Posted by 용식

댓글을 달아 주세요

  1. 힘찬아빠 2011.07.01 09:26  댓글주소  수정/삭제  댓글쓰기

    애독자입니다 ^^
    아주 귀한 자료가 되겠네요
    모쪼록 끝까지 힘써주시길~

    • 용식 2011.07.01 14:54 신고  댓글주소  수정/삭제

      감사합니다!!
      열심히 써 보겠습니다.

      내용 중 잘못된 부분이나
      문의 하실 내용 있으시면 언제든 답글 달아주세요!

  2. 2011.07.01 13:27  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 용식 2011.07.01 18:27 신고  댓글주소  수정/삭제

      아..! 제가 루씬에서의 업데이트가 delete 후 insert로 알고 있어서 착각을 했던 모양입니다.!
      지적해주셔서 정말 감사합니다.
      사실 제가 루씬이나 검색에 대해서 깊게 알고 있는 것은 아니라서
      사실 공개하면서도 두근거리기도 하고 조마조마하기도 하거든요..
      이렇게 잘못된 내용을 지적해주시면 저도 좋고 보시는 다른분들도
      큰 도움이 되실 것 같습니다.

      지적해주신 내용은 바로 수정할게요!

      저 그런데 요즘 홈페이지 접속이 안되어서
      좀 걱정이 되었었는데 이렇게 덧글을 남겨주시니
      매우 반갑고 안심이 되네요..^^

      앞으로도 많은 지도 부탁드릴게요. 감사합니다!

  3. 박발마남 2011.07.04 17:09  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 좋은 글 정말 감사드립니다.
    https://dev.naver.com/svn/aboutlucene 여기는 비밀번호가 필요해서 아직 못받아봤습니다.
    코드에 보면 import 하는게 많은데, 그냥 루씬 받아서 깔고 해당 폴더에 위에 올려주신 샘플 코드를 돌리는건가요?

    • 용식 2011.07.04 18:36 신고  댓글주소  수정/삭제

      안녕하세요!
      익명 접근이 된다고 해서 암호가 필요 없을 줄 알았는데..
      필요하네요.,.

      "anonsvn" 로 접속해보시면
      될 듯 합니다.

      아 그리고 가급적 루씬을 제외한 다른 라이브러리는 사용하지
      않으려고 하고 있구요.. 사용한 라이브러리들은 모두 svn에 같이
      커밋해두었으니 별다른 어려움은 없으실거에요.

      감사합니다 ^^

  4. decard9 2013.08.12 18:21  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    글 잘 읽었습니다. 근데 제가 다운받은 루씬 버전에는 잘 적용이 안되서
    제가 소스를 조금 수정해봤습니다.
    http://blog.naver.com/alucard99/193069172
    맞게 한 건지 모르겠네요.. 그럼 수고하세요..

    • 용식 2013.08.12 18:44 신고  댓글주소  수정/삭제

      안녕하세요? ^^ 댓글 감사드립니다.
      루씬 4.X 버전에 맞춘 소스는 따로 리포지토리를 관리하고 있습니다. ^^
      https://github.com/need4spd/aboutLucene_4
      이구요~

      멀티프로젝트로 합치는것을 한번 고려해봐야겠네요..

      정상적으로 작동한다면 아마 제대로 수정하신걸거에요..
      제가 코드가 잘 기억이 안나서.. 확실하게 비교해서 대답을 해드릴 수가 없어서.. 죄송합니다. ^^

      좋은 하루 되세요~!