본문 바로가기

about lucene

[aboutLucene] [4.0] Field 인덱싱을 할 때 사용되는 클래스인 Field도 4.0으로 넘어오면서 완전히 사용법이 변경되었습니다. 기존에는 아래와 같이 사용하였습니다. new Field("ids", ids[i], Field.Store.YES, Field.Index.NOT_ANALYZED) 4.0부터는 위처럼 Store, Index 등의 enum 타입을 파라메터로 갖는 생성자들은 모두 deprecated 처리가 되었고, 대신 FieldType이라는 클래스가 새로 생겼습니다. 위의 Field 인스턴스 생성 구문은 아래와 같이 대체가 가능합니다. NumericField를 대신해서 각 number type별로 Field 클래스가 생겼습니다. 더보기
[about Lucene] [4.0] Analyzer.ReuseStrategy 3.6 버전까지는 TokenStreamComponents를 재사용하기 위해서 커스텀 Analyzer를 만들때 ReusableAnalyzerBase 클래스를 상속받아야 했습니다. 그리고, reuseableTokenStream() 메서드를 실행하여 TokenStream을 얻어왔었는데요.. (참고 : http://devyongsik.tistory.com/377) 4.0에서 보니 ReusableAnalyzerBase 클래스가 없어지고 대신, TokenStreamComponents를 재사용하기 위해서 Analyzer.ReuseStrategy가 사용됩니다. Strategy 패턴이고요.. 기본적으로 두개의 Strategy 구현 클래스가 제공됩니다. 1. GlobalReuseStrategy 2. PerFieldReus.. 더보기
[about Lucene] SearcherLifetimeManager SearcherLifetimeManager입니다. 이 매니저클래스는 Searcher의 버전별 저장소라고 생각하시면 됩니다. 이 클래스가 없어도 Near Real Time Search를 사용 할 수 있는데요, 이 클래스가 필요한 이유를 아래의 블로그 http://www.searchworkings.org/blog/-/blogs/380754/maximized 에서는 이렇게 설명하고 있습니다. 무조건 새로운 버전의 IndexSearcher를 가지고, 실시간으로 인덱스의 변경 내용을 사용자에게 보여주는 것이 좋은 것은 아닙니다. A라는 사람이 검색을 처음 시도하고, 1페이지에서 원하는 것을 찾지 못해 2페이지로 넘어가는 케이스에서, 다른 누군가에 의해 인덱스가 변경되어 새로운 IndexSearcher를 사용하여 .. 더보기
[about Lucene] NRTManager (Lucene 3.6.1) NearRealTime Manager입니다. 앞서 포스팅하였던 SearcherManager를 사용할때 생성자에 IndexWriter를 주면 IndexWriter로부터 NRT IndexReader (루씬사용자들이 아마.. IndexWriter로부터 얻어내는 IndexReader를 NRT IndexReader라고 하는 듯 합니다.)를 얻어내서, IndexWriter를 통한 Document add/update/delete등의 반영이후 commit이 없어도 mayRefresh() / acquire() 메서드를 통해 얻은 IndexSearcher가 변경된 내용을 가져 올 수 있는 예제를 봤습니다. NRTManager 역시 Near Real Time Search를 위한 유틸성 클래스입니다. 다만 SearcherMa.. 더보기
[about Lucene] SearcherManager 루씬 3.5버전부터 제공되는 유틸리티성 클래스입니다. IndexSearcher의 재사용과 IndexWriter로 변경된 인덱스를 새로 가져오기 위해 저런 매니저 클래스를 매번 새로 만들어서 사용했었는데 아예 3.5 버전부터 제공이 되어 나오네요. (Lucene in Action 2판에도 소개가 되어있습니다. 361P) 여러 스레드가 IndexSearcher 인스턴스를 안전하게 열고 닫고 하면서 사용 할 수 있는 기능을 제공하여 줍니다. acquire/release API를 제공하며, IndexReader를 열고 닫기 위한 병렬처리의 복잡함을 알아서 처리해주도록 구현이 되어있습니다. 3.5버전과 3.6버전에서 SearcherManager 인스턴스를 생성하는 방법이 조금 바뀌었는데요.. (생성자의 파라메터가.. 더보기
[about Lucene] 사내 세미나 파이썬 스터디가 반쪽 성공(반쪽 실패?)으로 끝난 이후다음 스터디를 준비하는 과정에서.. 얼마전 시리즈로 포스팅하였던about Lucene에서 기본적이고 쉬운(?) 내용들과실제 사내에서 활용한 사례를 가지고 루씬에 대한 사내 세미나를 2회에 걸쳐 진행하려고 하고 있습니다.(너무 길면 힘들다.. 라는 교훈도 지난 스터디를 통해 얻었습니다. -_-) 문서를 만들고 있는데...https://docs.google.com/open?id=0B9vUAZZ3ZLlYYnpCeHN0bWNRVi00ZmlDRFI5N1Ywdw멋들어진 문서 만들기라는 것이 정말 쉽지 않네요. 검색에 대해서 모르시는 분들루씬에 대해서 모르시는 분들을 대상으로 하는세미나이기 때문에 내용이 몹시 평이하고, 좀 세부적인 내용들은다 제외된 상태이기는 하.. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 Sort와 CustomScore 검색결과에 대한 기본적인 정렬은 TF-IDF에 의한 유사도 점수입니다. 하지만 검색결과를 우리의 입맛대로 조절해야 하는 경우가 있습니다. 이를 위해서 루씬에서는 Sort클래스와 그외 몇가지 확장 가능한 API를 제공합니다. 여기서는 우선 Sort클래스의 기본적인 사용법을 확인해보겠습니다. SortTest.java 보시면 2개 필드에 대해서 정렬을 하고 있습니다. Sort클래스의 사용은 우선 정렬에 사용 할 SortField를 생성하고 이를 사용해 Sort클래스의 인스턴스를 만들어서 IndexSearcher를 통해 검색을 합니다. 여태까지 IndexSearcher로부터 받아오는 결과 클래스가 TopDocs였지만 필드 정렬을 사용 할 때는 TopFieldDocs라는 클래스로 결과가 받아집니다. 이 외에도 C.. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 Query와 Filter 이번 포스트에서는 루씬에서 사용되는 Query와 Filter의 기본적은 사용예제를 보여드리려고 합니다. 다시 예전에 작성했던 IndexSearcherTest의 메서드들을 살펴보면 4가지 쿼리 타입에 대해서 테스트 케이스가 작성되어 있는 것을 보실 수 있습니다. IndexSearcherTest.java 각 메서드를 간단하게 살펴보면 우선 searchByTerm 메서드에서는 Term을 사용하여 Query를 만들고 있습니다. Term t = new Term("ids", "1"); Query q = new TermQuery(t); 위 쿼리는 ids 필드에서 값이 1인 Document를 검색하고 싶다는 뜻입니다. searchByBooleanQuery 메서드에서는 Term을 사용한 Query 2개를 BooleanQ.. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 - Near Realtime Search- 이번 글에서는 루씬인액션에서 소개되고 있는 Near Realtime Search에 대해서 작성해보려고 합니다. 기본적으로 IndexSearcher는 IndexWriter에 의한 변경 사항을 바로바로 반영하지를 못 합니다. 일반적으로 commit이 된 이후 IndexSearcher를 새로 생성하여야 IndexWriter에 의한 변경된 내용을 반영 할 수 있습니다. 제가 내부적으로 구현하여 사용하고 있는 프로그램에서도 이러한 부분을 Searcher를 새로 만들어서 사용하고 있습니다. RealTimeSearch.java 파일명은 RealTimeSearch이지만 사실 RealTimeSearch에 대한 예제는 아닙니다. 지금까지 루씬에서 IndexWriter에 의한 변경을 IndexSearcher에서 반영하기 위.. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 - IndexSearcher- 앞선 포스트에서 IndexWriter를 사용한 색인을 알아보았습니다. 이번에는 IndexSearcher를 사용한 Document 검색과 검색을 할 때 사용되는 Query에 대해서 알아보고 더불어..Filter까지도 함께 알아보도록 하겠습니다. 우선 간단한 IndexSearcher의 테스트 케이스입니다. IndexSearcherTest.java 특별히 어려운 코드는 없을 것 입니다. 테스트 케이스가 4가지가 있는데요 나중에 이야기 할 Query 종류에 따른 사용을 보여드리기 위해서 각각 테스트 케이스를 작성하였습니다. IndexSearcher를 사용 할 때의 주의 할 점은 여러가지가 있겠지만 그 중 가장 중요한 것이 IndexSearcher의 생성은 비용이 많이 들어가는 부분이기 때문에 가급적 단일 인스턴.. 더보기