본문 바로가기

루씬

[about Lucene] 루씬으로 검색엔진 개발하기 - Demo - 루씬이란 무엇인가? 에서 부터 시작을 해봐야 할 것 같습니다. 루씬은 full text 검색엔진을 만들 수 있는 라이브러리를 제공합니다. 검색엔진이라고 하면 키워드분석 / 색인 / 검색의 과정을 수행하는 것으로 크게 나눠 볼 수 있겠는데, 이런 과정들을 실제로 구현 할 수 있는 API를 제공합니다. 우선 루씬을 사용해서 색인과 검색이 어떠한 방식으로 이루어지는지 예제를 보는 것이 가장 손쉽게 루씬에 대해서 알아 볼 수 있는 방법이 될 것 같습니다. 이 예제들은 파일들로부터 내용을 색인하고 그 색인 파일을 사용하여 키워드로 내용을 검색하는 예제입니다. 굉장히 간단한 예제이지만 사실 검색엔진을 구현하는데 있어서 가장 필수적인 내용들은 거의 다 들어가 있다고 보셔도 됩니다. 그만큼 이 루씬이라는 라이브러리가 .. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 -Prologue- 최근들어 루씬에 대해서 개인적으로 혹은 블로그등을 통해서 문의를 해주시는 분들이 많이 늘었습니다. 검색에 대한 관심이 커진 이유인지 잘 모르겠네요~ 원래 재미있고 어려운 분야긴해서.. 예전에 GS에 있을 때 루씬인액션 번역본 (1.4 기준) 책 한권을 들고 루씬으로 검색엔진을 만들어 본다고 한번 개발을 했던 (이게 벌써.. 3년 4년전이네요...) 경험과 그때 공부한 내용들을 이곳에 정리하긴 하였는데 사실 Case by Case로 작성한 포스트가 많아 처음 루씬을 접하시는 분들은 보시기가 쉽지 않으셨던 것 같습니다. 그 당시 나름 Solr에 대응한다고 Moon(ㅋㅋ)이라는 이름으로 프로젝트를 진행하였었고 한번 테스트 해볼만한 상태까지는 개발을 했었지만 외부 사정에 의해서 거기서 진행을 접을 수 밖에 없었.. 더보기
[Lucene] Numeric 필드의 사용과 주의점 빠른 정렬을 위해서 Number의 값을 갖는 필드에 대해서 Numeric 필드를 사용하도록 이번에 로그 분석 프로그램을 개발하면서수정하였다. 아.. 근데 이걸로 이렇게 시간을 끌줄이야...ㅠㅠ 루씬은 String만으로도 색인이 가능하지만 숫자 필드에 대해서는 특별한 필드 타입을 지원하는데 그것이 바로 NumericField 필드이다. NumericField의 사용 위와 같은 방식으로 일반적인 필드 생성과는 조금 다른 방식으로 작동을 하게 된다. 위와 같이 필드를 설정하면 아래와 같은 쿼리식이 가능하다. 주의 할 점은 색인 할 때 사용한 Numberic 필드의 타입과 RangeQuery에 셋팅되는 타입이 같아야 한다. NumericField의 구간 검색 쿼리 생성 다만 주의 할 점은 필드에 들어가는 값의 .. 더보기
[Lucene] MultiSearcher의 사용 (3.0.3 기준) -2- IndexSearcher는 Index의 변경 내용을 그 상태로는 인지 하지 못 합니다. 주로 IndexWriter에 의해서 추가적인 색인이 되거나 IndexReader에 의한 삭제등이 될텐데요.. 제가 구현하고 있는 프로그램도 하루에 한번 로그를 분석 후 색인을 추가하기 때문에 색인 파일 변경에 대한 감지를 하여 이를 처리 할 수 있어야 했습니다. MultiSearcher를 사용했기 때문에 각 Searcher들이 바라보고 있는 Index파일들을 모두 체크하여 인덱스 파일이 변경되었을 경우 Index파일을 다시 열어서 IndexSearcher를 다시 생성하는 방법을 사용하기로 하였습니다. 각 Searcher별로 가지고 있는 IndexReader를 MultiSearcher로 부터는 직접적으로 얻을 수 없었기.. 더보기
[Lucene] MultiSearcher의 사용 (3.0.3 기준). -1- 이걸 쓴다쓴다 하면서 이제서야 써보네요.... 회사에서 간단하게 조회 할 수 있는 프로그램을 만들면서 루씬을 사용하여 데이터를 저장하고 조회 할 수 있도록 하였습니다. 검색어를 분석/통계 내는 프로그램인데 하루 몇십만건의 검색어와 그외 부가적은 데이터들을 색인하여 놓다보니.. 이게 1년이 넘어가자 인덱스 파일의 크기가 10G를 훌쩍 넘어가버리더군요.. 그래서 이번에 프로그램을 업그레이드 하면서 인덱스 파일을 년도별로 분리시키면서, 루씬에서 제공되는 MultiSearcher를 사용해보기로 하고 개발을 진행하였습니다. 1.단일 인덱스 파일로부터의 검색 그냥 기본적으로 검색을 한다고 하면 위와 같은 방식으로 검색을 하게 됩니다. 루씬에서 제공하는 MultiSearcher를 사용하기는 간단합니다. 위와 같은 단.. 더보기
[루씬] 동의어 필터 제가 만들어서 사용하던 Analyzer에서 쓰던 동의어 필터입니다. 쇼핑몰을 염두해두고 작업했던 분석기라서 동의어 처리가 필요했는데요 아이디어 및 기초 소스는 루씬인액션 책에서 얻었고.. 그 소스를 좀 수정해서 만들었습니다. 책에는 영어의 동의어를 어디 사이트에서 가져올 수 있다고 되어 있었는데 한글은 그런 사이트를 찾을 수가 없어서 생각해보다가 Analyzer의 최초 인스턴스 생성시 RamDirectory를 사용해서 동의어를 색인해 놓고 Token에 대한 동의어를 뽑아주는 방식을 사용했습니다. 동의어사전의 형식은 그냥 오라클,oracle 노트북,notebook,note피씨 식으로 한 row에 ,로 구분해서 넣어주시면 되고 사전명은 디폴트로 synonym.txt로 설정되어 있습니다. 위치는 webappl.. 더보기
IndexReader.isCurrent() IndexReader에 대해서.. 색인이 되어 있는 인덱스 파일이 있습니다. 이것을 IndexReader를 사용해서 IndexSeacher를 생성하겠습니다. 이때 reader.isCurrent()의 값은 true입니다. 이 상태에서 같은 인덱스 파일이 있는 디렉토리에 다시 색인을 해보겠습니다. 위 메서드를 이용해서 다시 색인하고 reader.isCureent()를 다시 확인해보면 결과는 false가 나옵니다. 새롭게 작성된 인덱스 파일이 존재하기 때문입니다. IndexWriter를 생성 할 때 생성자에 들어가는 3번째 인자가 인덱스 파일을 지우고 새로 생성하느냐 아니면 추가되는 document를 append 하느냐를 나타냅니다. (true면 새로 생성) IndexWriter writer = new Ind.. 더보기
[lucene] IndexReader reopen. 루씬에서 IndexReader와 IndexSearcher 그리고 IndexWriter는 보통 하나의 인덱스 파일을 바라보며 작업을 합니다. 그리고 서로가 인덱스파일의 상태를 공유하지 못 합니다. 기본적으로 읽기/쓰기 등에 대해서 한꺼번에 작업이 일어나지 못 하도록 Lock 기능을 보유하고 있긴 하지만 IndexWriter가 인덱스 파일에 Document를 추가하고 commit을 시켰다고 해서 그 내용이 바로 IndexReader나 IndexSearcher에게 영향을 미치지 못 합니다. 하지만 검색 서비스를 위해서는 항상 일명 전체색인만으로 서비스를 제공할 수 있는 경우는 거의 없습니다. 증분색인 혹은 실시간 색인을 통해 일정 주기마다 변경되는 사항을 인덱스 파일에 반영 할 필요가 있습니다. 이것은 Ind.. 더보기
루씬 손 놓은지.. 두달.. 예전에 루씬으로 검색엔진 만들어 보면서 계속 메일링 리스트도 모니터링하고 했었는데 플젝 투입되고 하면서 그것도 못한진 두달 정도 되어간다.. 까먹을까봐 걱정된다 --;;;; 뭐 알고 있는 것도 많지 않았지만 서두... 감은 잃지 않았으면 좋겠는데...쩝~ 더보기
루씬 Score. 루씬 2.4로 넘어오면서 Hits 객체로 검색 결과를 받아오던 방식이 TopDocCollector를 이용하는 방식으로 변경되면서 Score를 조회했을때 그 Score가 이전 버전과는 다르게 나왔었습니다. 예전에는 0 ~ 1사이로 정규화가 되었었는데 지금은 아니더라구요. 왜 그러지 궁금해 하면서도 그냥 넘어가고 있었는데 마침 메일링 리스트에 관련된 내용이 올라왔네요. 일단, 현재 2.4 버젼에서 검색 후 검색된 Document의 Score를 얻는 방법은 아래와 같습니다. TopDocCollector collector = new TopDocCollector(10); searcher.search(query, collector); ScoreDocs[] hits= collector.topDocs().scoreDo.. 더보기