본문 바로가기

Lucene

[lucene] TermFreqVector 얻기. (lucene 3.6, lucene 4.0) 루씬 3.X 버전까지는 IndexReader로부터 Term과 TermFreq를 얻기 위해서 아래와 같은 코드를 사용하였습니다. IndexReader로부터 TermFreqVector termFreqVector1 = ir.getTermFreqVector(0, "f"); 와 같은 형태로 document 하나에 대한 TermFreqVector를 얻어내고 이를 통해서 term 배열과 freq 배열을 얻어서 조합하는 방식입니다. 4.0에서는 IndexReader.getTermFreqVector 메서드가 사라지고 대신 아래와 같은 방법을 사용합니다. IndexReader.getTermVector(0, "f") 메서드를 사용합니다. 이때 Terms라는 클래스의 인스턴스를 얻을 수 있는데, 위 코드의 예에서는 doucm.. 더보기
Terms.getSumTotalTermFreq() in Lucene 4.0 소스의 중복도를 체크하는 프로그램의 파일럿을 만들어보려고 새벽 출근한김에 뚝딱거려보았다. 뭐 기본적으로는 루씬으로 색인 후 루씬의 TermFreqVector를 이용해서 코사인유사도를 사용해서 일단 뽑아보는거였는데.. lucene 3.6까지는 TermFreqVector가 있었는데 4.0에서는 그것이 Terms, TermEnum, DocEnum등으로 대체가 된듯 하였다. 그래서 관련한 자료들을 찾아보고테스트 코드를 만들어가면서 이것저것 실행을 해보고 있었는데Terms.getSumTotalTermFreq()의 결과가 영~~ 이상하게 나온다. 계속 -1이 나오는것.. IndexReader로부터 하나의 Document에 대한 Terms 인스턴스를 얻어내면그 Terms의 인스턴스는 딱 하나의 Document가 색인.. 더보기
lucene 4.0 index statistic http://stackoverflow.com/questions/13537126/term-frequency-in-lucene-4-0http://blog.mikemccandless.com/2012/03/new-index-statistics-in-lucene-40.htmlhttp://lucene.apache.org/core/4_0_0/core/org/apache/lucene/index/package-summary.html#termstats 나중에 별도로 포스팅 예정.. and mighttp://lucene.apache.org/core/4_0_0-BETA/MIGRATE.html 더보기
[Lucene] IndexDeletionPolicy 참고용 링크 http://lucene.jugem.jp/?eid=179http://blog.softwaregeeks.org/archives/118 더보기
[Lucene] Result Grouping http://www.searchworkings.org/blog/-/blogs/faceting-%26-result-grouping 더보기
[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.. 더보기
[aboutLucene] FilteringTokenFilter FilteringTokenFilter에 대한 포스트입니다. 4.0부터 처음 나온 필터 클래스는 아닙니다만.. (3.1 부터 나온 것 같습니다.) 제가 원래 Token의 제거를 (불용어 같은 케이스) TokenFilter를 상속받아서 직접 구현해서 쓰고 있었는데 이번에 4.0으로 전환하려고보니 이 filter 클래스가 눈에 띄워서 보게되었습니다. TokenStream이 가지고있는 Attribute의 구현 클래스중에 PositionIncrementAttribute가 있습니다. 이것은 Token화되어 나온 키워드의 위치 증가를 보여주는 속성인데요.. 예를 들어서 "자바 개발자 장용석" 이라는 문장을 공백을 기준으로 키워드 추출한다고 했을 때 기본적인 PositionIncrementAttibute의 값은 자바 .. 더보기
[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.. 더보기