본문 바로가기

Lucene

[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할 것인지 정해주는 것입니.. 더보기
[lucene] TermFreqVector, TermPositionVector 루씬 인 액션을 보던 중 텀벡터에 대한 얘기가 나와서 살펴보았다. 간단하게 색인을 해 놓고.. 소스를 간단하게 만들어서 돌려보았다.. package kr.co.gshs.lucene.test; import java.io.IOException; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.TermFreqVector; import org.apache.lucene.index.TermPositionVector; import org.apache.lucene.index.TermVectorOffsetInfo; public class TermVectorT.. 더보기
[lucene] 복합명사 추출. Filter Class 일단 이름 Term을 사전에서 찾아내고 그 다음에 하는 일이 명사를 추출하는 것이다. 어케 보면 별거 없는데 이따 참으로 고민을 많이했다. 일단 명사 사전이 있다 치고, 과연 어떻게 만족스러운 명사 추출을 할 것인가... 대표적인 예가.. "검색엔진개발자" 라는 단어가 있고 사전에는 "검색" , "엔진", "개발자" 라는 단어들이 있다고 하자.. 원하는 결과는 "검색엔진개발자" , "검색", "엔진" ,"개발자", "검색엔진", "엔진개발자" 이런식의 결과가 나오기를 원했다. 처음에는 앞에서 부터 하나씩 서치해가는 방식이었는데.. 즉.. 검 검색 검색엔진 검색엔진개... . . 색 색엔 색엔진 색엔진개.. 이런식.. 이게 너무 하나의 단어에 대해서 loop를 많이 돌고 결정적으로 위의 경우에서 사전에 ".. 더보기
[lucene] Dictionary Class. CharTokenizer에 이어서 한글 Analyzer를 만들기 위해 작성한 사전 클래스입니다. 이 클래스는 루씬에서 제공되는 클래스는 아니고 제가 필요에 의해서 작성한 클래스입니다. 기본적인 틀은 루씬 인 액션에 있는 소스를 참고하였고 세부적인 내용은 제가 작성을 하였습니다. 참고해주시구요.. 사전을 몇개 만들었다. 명사사전/ 이름사전/ 불용어사전/ 동의어사전/ 어미제거사전 자..이렇게 해놓고 모든걸 적용시켜보니.. 일단 색인어 추출을 (not 형태소분석) 하는데 있어서 어미제거가 되어버리면 , 단어가 너무 많이 망가지는 현상이 발생하여 현재는 어미제거는 하지 않고 있다. 위 사전들을 적용한 클래스를 앞으로 하나하나 작성을 해볼텐데.. 일단 기본이 되는 사전 클래스.. 사전 클래스는 어렵게 구현하지는 .. 더보기
[lucene] CharTokenizer를 살펴보자. 한글 색인어 추출기 작업을 위해서 가장 먼저 살펴봐야 했던 class가 CharTokenizer였다. 정말 아무것도 모르는 상태에서 시작하게 된거라서 난감하기도 했고 오픈소스라는 놈을 처음 열어보는거라..(그냥 쓰기만했지... 이걸 까볼줄은...;;) CharTokenizer를 열어보았을때 느낌은.. "이 뭥미?" 이해가 전혀 되지 않았다 -_- 그냥 일단 한손에 삽들고 팠다. CharTokenizer는 루씬에서 모든 Analyzer의 기본이 된다. 이놈의 역할은 문장을 읽어들여서 Token을 만들어 반환하는 것이다. 그럼 어떻게 Token을 만드느냐.. 한글자씩 읽어와서 문자냐 아니냐를 판단하여 만들어내는데 그 역할 하는 것이 protected abstract boolean isTokenChar(cha.. 더보기
[lucene] 색인에서...Document와 Field의 추가 루씬에서는 하나의 색인에 여러개의 Document를 추가 할 수도 있고 하나의 Field에 여러개의 값을 색인 시킬 수도 있다. 다음의 경우를 보자.. org.apache.lucene.document.Document doc_lucene = null; Field field = null; IndexWriter indexWriter = new IndexWriter(...); for(int i = 0; i < 10; i++) { doc_lucene.addDocument(field = new Field("id", "아이디"+i. Field.Store.YES , Field.Index.UN_TOKENIZED)); doc_lucene.addDocument(field = new Field("content", "내용"+i.. 더보기
[lucene] 네이버 블로그에 첫 공부때 올렸던 글 이번 루씬 프로젝트를 시작하면서.. 색인 : // indexWriter를 생성한다. 경로와 분석기를 넘겨줌 IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(), true); // 복합파일이냐 멀티파일이냐.. (추후설명) writer.setUseCompoundFile(false); // 색인에 추가될 Document 생성 Document doc = new Document(); //Document에 필드 추가 doc.add(Field.Text("contents", new FileReader(f))); doc.add(Field.Keyword("filename", f.getCanonicalPath())); //색인에 Document 추가 w.. 더보기
[lucene] Highlighter와 Fragmenter 루씬의 sand box 격으로 제공되는 라이브러리중 검색결과와 매칭되는 키워드에 하이라이트를 주기 위한 라이브러리가 있다. 그것이 바로 위의 Highlighter와 Fragmenter이다. 일단 기본적인 사용법은 간단하다. public class HighlightIt { private static final String text = "my fox jump group org next fox spring health care book fox tape java fox fox shop world fox"; public static void main(String[] args) throws IOException, ParseException { TermQuery query = new TermQuery(new Term.. 더보기
[lucene] 오랜만에 진행중인 상황 올려봅니다. 커.. Analyzer하나 만드는게 장난 아닙니다. 전에 올렸듯이.. Tokenizer는 기본적으로 스페이스,특수문자,영어&숫자 와 한글 분리 로 토큰을 만들어 내는 방식을 고수하고 있습니다. 문제는 이제 저렇게 해서 나온 TokenStream을 받아서 어떻게 색인어를 추출하느냐.. 마땅히 어디서 구할 사전도 없고 해서 정말 아는 것도 없는 놈이 막코딩을 하고 있습니다..ㅠㅠ 일단 기본적인 명사 사전을 가지고.. 들어온 Token에서 명사를 추출해야 하는데.. 현재는 이런 방식을 쓰고 있습니다. String target_term = "언어로배우는자바디자인패턴"; for(int i=0; i < target_term.length(); i++) { for(int j=i; j < target_term.lengt.. 더보기