본문 바로가기

Lucene

[about Lucene] 루씬으로 검색엔진 개발하기 - Demo -

루씬이란 무엇인가? 에서 부터 시작을 해봐야 할 것 같습니다.
루씬은 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를 사용하여 직접 구현하는 방식을 사용해야 합니다. 

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