본문 바로가기

Lucene

루씬 2.9 많이 바뀌었네요...;;;; 오랜만에 개인적으로 뭘 만드느라고 다시 루씬을 만졌는데.. 2.9가 릴리즈 되어 있어서 냉큼 받아서 사용하려고 해보니 많이 바뀌었네요 --;;;; 3.0으로 넘어가기 위한 준비인가.... 검색 하려면 아래와 같이.. SortField sf = new SortField("count", SortField.LONG, true); Sort sort = new Sort(sf); Directory dir = FSDirectory.open(new File("d:/index")); IndexSearcher searcher = new IndexSearcher(IndexReader.open(dir, true)); TopFieldCollector collector = TopFieldCollector.create(sort, .. 더보기
IndexReader.isCurrent() IndexReader에 대해서.. 색인이 되어 있는 인덱스 파일이 있습니다. 이것을 IndexReader를 사용해서 IndexSeacher를 생성하겠습니다. 이때 reader.isCurrent()의 값은 true입니다. 이 상태에서 같은 인덱스 파일이 있는 디렉토리에 다시 색인을 해보겠습니다. 위 메서드를 이용해서 다시 색인하고 reader.isCureent()를 다시 확인해보면 결과는 false가 나옵니다. 새롭게 작성된 인덱스 파일이 존재하기 때문입니다. IndexWriter를 생성 할 때 생성자에 들어가는 3번째 인자가 인덱스 파일을 지우고 새로 생성하느냐 아니면 추가되는 document를 append 하느냐를 나타냅니다. (true면 새로 생성) IndexWriter writer = new 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.. 더보기
[lucene] Sort와 SortField 예전에 1.4 버젼으로 개발 할 때는 Sort하는 방법을 하나밖에 몰랐습니다. Sort 클래스를 이용하는 거였는데요 방법은 아래와 같습니다. Sort sort = new Sort("TITLE", true); TopFieldDocs tfd = searcher.search(query,null,50,sort); 물론 예전에는 Hits 객체에다가 바로 받아왔지만 현재는 Hits 는 deprecated 되었으므로 위와 같이 사용합니다. 그리고 지금은 하나의 방법을 더 알게 되었는데 그것이 SortField를 사용하는 방법입니다. 위의 예제를 SortField를 사용하는 방식으로 변경해보면 SortField sf = new SortField("TITLE",SortField.STRING,true); Sort sort.. 더보기
luke 0.9.1 release. http://www.getopt.org/luke luke 0.9.1 버그 픽스 버젼이 릴리즈 되었습니다. 루씬을 사용하는 분들이라면 필수로 사용하셔야 할 툴이죠 ^^ 릴리즈된지는 꽤 되었는데.. 까먹고 있다가 이제서야..--ㅋ 루씬 2.4 버젼부터는 루크 0.9 이상의 버젼을 사용해야 하는 것으로 알고 있습니다. 그럼 수고하세요~ 더보기
[lucene] Analyzer와 Filter (lucene 1.4.X) 루씬의 Analyzer는 아래와 같은 구조로 되어있습니다. public TokenStream tokenStream(String fieldName, Reader content) { return new GSKoreanSynonymFilter( new GSKoreanStopWordFilter( new GSKoreanSeperatorWordFilter( new GSKoreanSeperatorNameWordFilter( new GSKoreanTokenizer(content){} //GSKoreanTokenizer ) // GSKoreanSeperatorNameWordFilter ) //GSKoreanSeperatorWordFilter ), engine); } TokenStream을 만들고 정규화를 시키는 Toke.. 더보기
[lucene] 루씬 한글 Analyzer 복합명사 추출 로직 변경 루씬 한글 Analyzer 복합명사 추출 로직을 거의.. 확정하였습니다. (도대체 몇개월 만인지...ㅠㅠ) 일단 구조 자체는 Tokenizer에서 Token 추출 로직을 좀 만져주고.. 나머지는 Filter Class에서 처리하는 방식입니다. 동의어 Filter만 적용하고 불용어나 어미제거 필터는 일단 만들어 놓고 적용은 하지 않기로 했습니다. 단순 명사추출이기 때문에 더 망가지더군요...;;; 사전 기반의 명사 추출입니다. 문서 색인용 Filter와 사용자 입력 키워드 분석용 Filter를 따로 만들었습니다. 두개의 로직이 약간 다른데요 일단 문서 색인용은 1. Token을 끝까지 탐색하여, 사전에 있는 가장 긴 명사를 추출 2. Token을 순차적으로 탐색하며, 명사를 추출 3. Token그 자체를 .. 더보기
[solr] 이런 오픈소스가......ㄷㄷ;;; 얼마전에 휴가를 다녀왔습니다. 지금은..열심히 사회 적응 훈련 중입니다 -_-; 루씬으로 한글 Analyzer를 만들고, 커스텀 쿼리 파서도 만들고, 나름대로 톰캣에 올려서 검색서버 처럼 사용하게 할 수 있는 파이럿 프로그램까지 만들었는데.. 루씬 메일링 리스트에 solr solr 하길래 뭔가 봤더니.. 음...정확히 안봐서 모르겠지만 검색서버인듯 하군요...-_-;;; ㅠㅠ 뛰어난 사람들이 만든 오픈 소스니 성능도 좋을 것 같고..실제로 써보셨다는 어느분의 포스트를 보아도 상당히 좋은 성능을 발휘하는 모양입니다.. 색인과 검색 부분을 담당해 준다던데.. 프로젝트 시작이 이제 코앞이라 이거 볼 수 있을지 모르겠지만 한번 살펴보려고 합니다. 세상은 넓고 오픈 소스는 정말 많네요 -_-b 루씬을 사용 한 것.. 더보기
[lucene] FSDirectory와 RAMDirectory를 활용한 인덱싱 구현 루씬인액션 책을 보면 FSDriectory와 RAMDirectory를 사용하여 RAMDirectory를 버퍼의 개념으로 활용한 인덱싱 예가 나옵니다. 이걸 한번 테스트 해보려고 해봤는데 잘 안되는 것 입니다. 일단 책에 나온 예는 아래와 같습니다. FSDirectory fsDir = FSDirectory.getDirectory(dirPath, true); RAMDirectory rmaDir = new RAMDirectory(); IndexWriter fsWriter = IndexWriter(fsDir, new SimpleAnalyzer(), true); IndexWriter ramWriter = IndexWriter(ramDir, new SimpleAnalyzer(), true); while(..) { .. 더보기
[lucene] Directory. 실시간 Document 추가. 루씬에서 색인이나 검색을 할 때 IndexWriter 그리고 IndexReader를 생성합니다. 생성법은 간단합니다. Directory dir = FSDirectory.getDirectory(dirPath); IndexReader reader = IndexReader.open(dir); IndexWriter writer = new IndexWriter(dir,Analyzer, true); 물론 맨 앞 파라메터인 dir은 String으로 path를 줘도 됩니다. 어차피 내부적으로 Directory 객체를 생성하여 초기화 시킵니다. IndexWriter의 제일 마지막 인자인 boolean 값은 새로운 Document를 Index에 추가 할 때 append 할 것인지 overwrite할 것인지 정해주는 것입니.. 더보기