본문 바로가기

Lucene

[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] StopAnalyzer...보다가.. 책에서는 StopAnalyzer에 의해 불용어가 제거되면 위치 증가값에 구멍이 생긴다고 되어있는데 실제로 테스트 해보면 안 그런지라.. 연속적으로 죽죽 잘 나오더라.. 버젼의 차이가 많으므로 대충 그 차이에 뭔가 있을거 같다 해서.. 뒤져보니.. StopFilter.class에 private static boolean ENABLE_POSITION_INCREMENTS_DEFAULT = false; private boolean enablePositionIncrements = ENABLE_POSITION_INCREMENTS_DEFAULT; public boolean getEnablePositionIncrements() { return enablePositionIncrements; } public void se.. 더보기
[lucene] SynonymFilter package lia.analysis.synonym; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.Token; import java.io.IOException; import java.util.Stack; public class SynonymFilter extends TokenFilter { public static final String TOKEN_TYPE_SYNONYM = "SYNONYM"; private Stack synonymStack; private SynonymEngine engine; public SynonymF.. 더보기
[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이 토큰을 뽑아내면 그 토큰에 새로운 토큰을 더하거나 삭제 할 수 있다. (분석기 확장 용이) 이를 염.. 더보기
[lucene] Token과 Tokenizer Token과 TokenStream 단어가 분석기를 거쳐서 토큰으로 변환되고, 토큰은 다시 텀으로 변환되어 색인에 저장된다. 하나의 토큰은 텍스트에서 얻어낸 하나의 단어를 의미하며, 시작위치, 끝위치, 토큰종류, 위치증가값등의 메타 정보를 갖는다. (the quick brown fox 같은 경우 각 토큰은 이전 토큰에 대해 한 단어만큼 뒤에 있기 때문에 모두 각각 1씩의 위치 증가값을 갖는다.) 토큰이 텀의 형태로 색인에 전달되는데 토큰의 단어와 위치 증가값만 사용된다. 토큰의 위치증가값이 1보다 큰 경우에는 단어와 단어가 떨어져 있다는 것이고, 0이라면 토큰의 위치가 이전 토큰과 같다는 의미이다. TokenStream에는 Tokenizer와 TokenFilter가 있다. Tokenizer는 글자 단위로 .. 더보기
[lucene] PharseQuery PharseQuery 색인에는 텀의 위치 정보가 있음. 두개의 텀 사이의 정확한 거리가 얼마인지에 대한 정보를 가지고 문서를 찾아냄. 검색하려는 텀을 본문의 텀과 일치시키는 방향으로 움직일 수 있는 이동 횟수의 최대값. -> 슬롭(slop)값 기본값은 0으로 정확히 일치하는 문장을 찾음. test 구문 the quick brown fox jumped over the lazy dog slop 0이면 quick fox 로 검색하면 검색 안됨 slop 1이면 검색 됨 fox를 한번만 움직이면 quick [brown] fox 가 되기 때문. 만약 fox quick으로 검색하면 fox를 3번 움직여야 quick [brown] fox가 됨. 다중텀도 지원한다. 한 문장에서 얼마나 많은 텀을 사용하는지에 관계 없이 .. 더보기
[lucene] 질의분석. QueryParser .. 질의를 파싱하는 거.. Query query = QueryParser.parse("+리바이스 +청바지", "prd_name", new CJKAnalyzer()); Searcher searcher = new IndexSearcher(dir); searcher.search(query); 이렇게 하거나... Analyzer analyzer = new CJKAnalyzer(); QueryParser parser = new QueryParser("prd_name",analyzer); parser.setDefaultOperator(QueryParser.AND_OPERATOR); Query query = parser.parse("리바이스 청바지"); Searcher searcher = new IndexSearcher.. 더보기