본문 바로가기

Lucene

[Lucene] DrillDown Facet Search in Lucene 4.6.1 앞선 포스트에서 FacetSearch에 대해 간단하게 알아보았습니다. http://devyongsik.tistory.com/679 앞의 예제에서 카테고리를 "java"에서 "programming/java"와 같은 형태로 상위레벨의 카테고리를 같이 표현하면어떻게 될까요? 한번 테스트를 돌려보면 아래와 같은 exception이 발생합니다. java.lang.IllegalArgumentException: delimiter character '/' (U+2f) appears in path component "programming/lucene" "/" 이 캐릭터가 문제가 된다는 것을 대략 알 수 있는데요.. 앞에 예제의 결과에서 색인시 CategoryPath를 생성할때 CategoryPath cp = new Ca.. 더보기
[Lucene] FacetSearch in Lucene 4.6.1 오랜만에 Lucene 포스트입니다.FacetSearch의 샘플 코드인데요.. 기능 자체는 예전 버전부터 제공이 되었던 기능입니다.FacetSearch란 무엇이냐 하면 간단하게 SQL의 group by와 같은 기능이라고 생각하시면 됩니다. 보통 쇼핑몰에서 검색결과를 카테고리별로 묶어서 해당 카테고리에 몇개의 상품이 검색되어 있는지등을보여줄때 많이 사용됩니다. 그리고, DB도 그렇지만 성능에 많은 영향을 미치는 기능이기도 하지요.. 11번가에서 검색 운영을 할때도 이런저런 성능적인 이슈들이 많았지만 그중 검색결과 페이지의 로딩 속도에 큰 영향을 주는 부분은 바로 이 group by 기능이었습니다. 예전부터 Lucene의 이 기능을 한번 사용해보고 싶었는데 이제서야 학습테스트 코드로나마 작성해보네요.. --ㅋ.. 더보기
[Lucene] NumberType Field 관련 crescent의 색인관리 페이지를 루씬 4.4로 바꾸면서 한구님께서 만드셨던 부분을 거의 다 손을 댔는데.. 그중 각 필드의 term 개수를 추출하는 부분에서 이상한 현상이 보였다. Long 혹은 Integer 타입의 필드에서 term이 이상하게 추출되는 것이었는데..현상은 두가지로 나타나고 있었다. 1. 색인된 숫자가 깨져서 보임2. 색인된 숫자보다 더 많은 term이 색인되어있음 테스트 코드를 만들어서 다시 확인을 해봐도 동일한 현상이었다.stackoverflow에도 같은 현상으로 질문이 올라온 것도 찾았다.http://stackoverflow.com/questions/11883066/luke-reveals-unknown-term-values-for-numeric-fields-in-index 위 코.. 더보기
[Lucene 4.X] IndexStatistic from Index https://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/core/org/apache/lucene/index/package-summary.html#stats 예전에 루씬4.0이 처음 나왔을무렵에..인덱스 파일에 대한 통계 정보를 가지고 오는 것을 한번 정리하려고 관련 자료만 스크랩을 해두었었는데요(http://devyongsik.tistory.com/576)이번에 관련 스크랩 정보를 사용해서, Lucene 4.4에서 한번 테스트를 해보았습니다. Junit을 사용한 학습 테스트를 작성하였지만, 시간상 Assert는 사용하지 않고 그냥 값들을 System.out.println으로 출력만 하도록 하였습니다. 이 부분은 나중에 다시 손을 좀 봐야겠습니다. 아무래도.. 더보기
[Lucene] Lucene을 활용한 간단한 이미지 검색 구현 오픈되어 있는 소스중에 이미지로부터 50자리의 0과 1로 이루어진 hashcode를 추출해주는 소스가 있다.(https://code.google.com/p/ironchef-team21/source/browse/ironchef_team21/src/ImagePHash.java?r=75856e07bb89645d0e56820d6e79f8219a06bfb7) 이미지 프로세싱에 대해서 잘 알고 있지 못 하기 때문에 정확하게 내용을 알고있지는 못 하지만이 50자리의 해시코드가 완전히 같은 경우 동일한 이미지로 인식이 된다. 소스중 distance를 구하는 메서드가 있는데 0~49 index까지 charAt 메서드를 사용하여 같은 숫자를 가지고 있는지 파악하여, 다른 숫자의 개수를 return해 주는 메서드이다. 이 .. 더보기
[Lucene] IndexDeletionPolicy - lucene 4.2.1 이전에 IndexCommit에 대해서 잠깐 확인을 해보았었는데요.. 이번에는 IndexDeletionPolicy에 대해서 확인해보려고 합니다. 기본적으로 제공되는 IndexDeletionPolicy의 구현 클래스로는 KeepOnlyLastCommitDeletionPolicy와 SnapShotDeletionPolicy가 있습니다. KeepOnlyLastCommitDeletionPolicy가 기본이구요. commit을 할때마다 commit의 정보를 가지고있는 IndexCommit 객체가 생성되는데 이 IndexCommit을 어떻게 할것이냐의 정책이라고 보시면 좋을 것 같습니다. 우선 기본적인 IndexDeletionPolicy에서 제공되는 메서드가 2개가 있습니다. 하나는, onInit 메서드 하나는 onC.. 더보기
[Lucene] IndexCommit - lucene4.2.1 IndexDeletionPolicy에 대한 내용을 보기전에 IndexCommit에 대한 학습예제를 조금 작성해보았습니다.lucene 소스에 있는 IndexCommit 테스트케이스에는 두개의 IndexCommit에 대한 비교만들어가 있네요.. 실제 commit시에 어떠한 값을 가지고 있는지 확인해보고 싶어서 아래와 같이출력만하는 학습테스트 클래스를 작성하였습니다. 결과를 보시면..1. commit이 일어날때마다 generation을 계속 증가합니다.2. commit이 일어날때마다 segmentcount 역시 증가합니다.3. segmentcount의 경우 위 예제에서의 결과만으로 보면, 문서를 하나씩 indexWriter에 add 후 commit을 하였기 때문에 문서 하나가 하나의 세그먼트에 들어갔고, 그 .. 더보기
[lucene] MultiFields.getTerms. getSumTotalTermFreq in Lucene 4.2.1 예전에 루씬으로 색인한 인덱스파일로부터 Term Freq를 뽑는 포스팅을 한적이 있는데요.. http://devyongsik.tistory.com/577http://devyongsik.tistory.com/578 그 당시에는 인덱스리더로부터 TermVector를 하나 들고와서 TermVector로부터 Terms 객체를 얻어서getSumTotalTermFreq()를 실행했었고 이 값이 -1이 나왔었습니다. 이건 전체 Term의 Freq의 합이죠.. IndexReader ir = IndexReader.open(dir);Terms terms1 = ir.getTermVector(0, "f"); System.out.println(terms1.getSumTotalTermFreq()); 당시 루씬 메일링 리스트에 질.. 더보기
[Lucene] IndexWriter.updateDocument Lucene에서 indexWriter.updateDocument는 Term에 해당하는 document를 바로 update하는 것이 아니고delete 후 insert 로직으로 작동합니다. 즉, id=2인 document를 update 하려고 했을때, 인덱스에 id=2인 document가 없다면업데이트를 하려고했던 document가 insert가 됩니다. 간단한 테스트케이스를 보시면..처음에 id=1인 문서를 색인하고(addDocument) 그 이후에 id=1인 term query로 update를 합니다. update 후 id=1로 검색을 한 결과를 보면 아래와 같이Assert.assertTrue(topDocs.totalHits == 1);Assert.assertEquals("document 1 update.. 더보기
[Lucene][링크] Lucene 4.X 이클립스 프로젝트로 import 하기 저와 같이 Crescent 프로젝트를 진행해주고 계시는 강한구님과저에게 항상 많은 영감과 자극을 주시는 진성주님의 두개 포스트를 링크합니다. 1. http://blog.softwaregeeks.org/archives/8162. http://dol9.tistory.com/217 우선 1번의 진성주님 블로그를 보시고 프로젝트 import까지 진행하시고2번의 강한구님의 블로그를 보시면서, codec, core, test-framework를 ant build 후클래스패스에 추가해주신다음에 테스트 케이스를 돌려보면 잘 되실거에요. 저 같은 경우는 core는 이미 클래스패스에 추가가 되어있기는 했었는데요..아무튼 빠진것들을 넣어주시면 될 것 같습니다. 라이브러리를 익히는데 테스트 케이스를 보면서직접 이것저것 해보는.. 더보기