본문 바로가기

Lucene

[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.. 더보기
[lucene] 한글 analyzer 컨셉을 잡아봤습니다. 루씬에서 사용 할 색인어 추출기.. 컨셉을 잡아봤습니다. 명사만 뚝뚝 추출 할 것이냐, 문장 그대로를 검색 시킬 것이냐.. 예를 들면 "쇼핑몰 포인트를 어디서 받을 수 있을까요" 라는 검색어가 들어올 경우 키워드만 추출하는 (쇼핑몰/ 포인트)가 아닌 "어디서 받을 수 있을까요" 라는 문장만으로도 검색이 가능하게 하는 그런것이 트렌드인듯 합니다. 네이버도 그렇고.. 구글도 그렇고... 일단.. 이렇게 가려고 합니다. Tokenizer를 상속받은 KoreanTokenizer 클래스를 만들어서 어절분리(띄어쓰기..), 특수문자제거, 한글-영어/숫자 분리(삼성mp3 -> 삼성, mp3), 소문자 정규화를 시키고 명사사전을 사용하여 명사를 분리하는 Filter 클래스를 만들고.. 필요없는 어미를 제거하는 Filt.. 더보기
[lucene] 루씬으로 사용 할 한글 Analyzer를 제작 중입니다. 루씬을 사용하기 위해 상품명 색인어 추출을 위한 Analyzer를 제작중입니다. 맨땅에서 할 실력이 안되어서 루씬인액션 책에 있는 StemFilter를 참고하여 텍스트 사전 기반의 StemFilter를 하나 만들고 CharTokenizer를 참고하여 영문/숫자와 한글을 분리해내는 Tokenizer를 하나 만들어서 시작 해볼 생각입니다. 형태소 분석이라기 보다는 말 그대로 색인어 추출에 가깝죠..;; 국어도 못 하고 형태소 분석하기 위해서 국어 공부와 알고리즘 등등을 할 엄두가 나지 않아 일단 부딫혀 봤습니다. 빡세네요..^^;; 그래도 저한테는 많은 도움이 될 것 같습니다.. 정리되는대로 소스도 올려보고 해서 많은 도움 받았으면 좋겠네요..웅 일단 정품 아베크롬비 프리티 베드포드 핫팬츠/반바지[착불], .. 더보기
[lucene] 모르겠다.. CharTokenizer..ㅠㅠ CharTokenizer.. Analyzer WhitespaceAnalyzer = new WhitespaceAnalyzer(); TokenStream stream = analyzer.tokenStream("contents", new StringReader(text)); Token token = stream.next(); 바로 이 next...!! stream.next는 TokenStream의 next 메서드가 호출되고 이는 public Token next() throws IOException { Token result = next(new Token()); if (result != null) { //이것들은 무엇을 하기 위한 로직인고..;; Payload p = result.getPayload(); if .. 더보기
[lucene] 필드별 Analyzer 지정 PerFieldAnalayzerWrapper analyzer = new PerFieldAnalyzerWrapper(new SimpleAnalyzer()); analyzer.addAnalyzer("field_name", new KeywordAnalyzer()); Query query = QueryParser.parse("filed_name:S12 AND SPACE", "descrption", analyzer); Hits hits = searcher.search(query); ... 더보기
[lucene] 분석기(Analyzer) 의 구조. Analyzer는 텍스트를 일련의 토큰 (TokenStream)으로 변환한다. TokenStream 클래스는 Token 클래스를 차례로 반환한다. Token은 문자열, 시작위치, 끝 위치, 토큰 종류, 위치 증가값등을 갖고 텀은 단어와 위치 증가값만을 사용하여 변환되며, 텀이 바로 색인에 저장되는 단위이다. TokenStream에는 Tokenier와 TokenFilter가 있고 Tokenizer는 글자 단위로 토큰을 만들고, TokenFilter는 토큰 단위로 처리를 한다. Tokenizer가 TokenStream을 반환하면, TokenFilter는 TokenStream을 입력 받아 TokenStream이 토큰을 뽑아내면 그 토큰에 새로운 토큰을 더하거나 삭제 할 수 있다. (분석기 확장 용이) 이를 염.. 더보기