본문 바로가기

Lucene

[lucene] fieldsNorm http://www.mail-archive.com/lucene-user@jakarta.apache.org/msg06275.html 루씬에서 디폴트로 랭킹 (유사도 점수)를 구하는 fact 중에 fieldsNorm이 있다.. fieldNorm is defined as getBoost(t.field in d) * lengthNorm(t.field in d) These two values are multipled into a single value at index time, and it is unfortunately impossible to separate them at search time, when explanations are produced. If you never apply boosts, fieldN.. 더보기
[lucene] search speed 향상 앞서 쓴... 색인속도향상에 대한 글에 검색 속도 향상에 대한 글도 링크가 걸려 있길래... 같이.. http://wiki.apache.org/lucene-java/ImproveSearchingSpeed 지금 안 보면.. 또 안 읽어볼거 같아서 -_-; 1. 정말 검색 속도 개선이 필요한지 점검해보라. -> 많은 아이디어들이 간단하게 적용 할 수 있는거지만, 다른 것들은 당신의 프로그램에 복잡함을 증가 시킬 수 있다. 2. 루씬의 최종버젼인지 확인 3. 로컬 파일 시스템을 사용하라. 4. 더 좋은 하드웨어, 특히 더 빠른 IO 시스템 5. 하드웨어에 RAM을 추가하거나, JVM의 heap 메모리를 증가시켜라. 6. IndexSearcher를 싱글턴 패턴으로.. 7. 성능측정시에 첫번째 쿼리는 무시하라. .. 더보기
[lucene] Indexing Speed 향상 메일링 리스트에 참고 될 만한 자료가 있길래.. 한번 정리해 봅니다. (영어가 짧아 오역이 있을 수 있습니다.. 지적해주세요 ^^) 원문은 http://wiki.apache.org/lucene-java/ImproveIndexingSpeed 여기에 있습니다. 1. 정말로 스피드 향상이 필요한지 확인해보라. 2. 최종 버젼을 사용하라. 3. 로컬 파일 시스템을 사용하라. - 네트워크 파일 시스템을 사용하지 말라. 4. 좀 더 빠른 하드웨어, 특히 빠른 IO 시스템 5. Writer는 하나만 생성하고 인덱스 세션 동안 재사용하라. 6. Flush는 document count가 아닌 RAM 사용량으로 하라. - > 2.3에서 IndexWriter는 RAM 사용량에 따라서 자기 스스로 flush를 할 수 있다. .. 더보기
[lucene] 루씬 한글 Analyzer 복합명사 추출 로직 변경 루씬 한글 Analyzer 복합명사 추출 로직을 거의.. 확정하였습니다. (도대체 몇개월 만인지...ㅠㅠ) 일단 구조 자체는 Tokenizer에서 Token 추출 로직을 좀 만져주고.. 나머지는 Filter Class에서 처리하는 방식입니다. 동의어 Filter만 적용하고 불용어나 어미제거 필터는 일단 만들어 놓고 적용은 하지 않기로 했습니다. 단순 명사추출이기 때문에 더 망가지더군요...;;; 사전 기반의 명사 추출입니다. 문서 색인용 Filter와 사용자 입력 키워드 분석용 Filter를 따로 만들었습니다. 두개의 로직이 약간 다른데요 일단 문서 색인용은 1. Token을 끝까지 탐색하여, 사전에 있는 가장 긴 명사를 추출 2. Token을 순차적으로 탐색하며, 명사를 추출 3. Token그 자체를 .. 더보기
[lucene] HitCollector. 얼마전 포스팅에서 Hit이 deperecated 되고 TopDocCollector 를 사용하는 것이 추천된다고 하는데... 이때 메일링 리스트에서 많이 나왔던 얘기 중 하나가.. 상위 스코어의 몇개만이 아니라, Search가 된 모든 Id를 (혹은 document)를 얻을 수 있느냐 하는 얘기가 돌았던거 같다.. 그냥 살펴보고 있던 중.. (아직은 상세 API 까지는 확인을 안 해봐서...) Erick Erickson 라는 아이디를 쓰시는 분께서.. The thing to remember is that in order to get the top-scoring documents (e.g. TopDocCollector or Hits), Lucene has to see how *every* document s.. 더보기
[lucene] 결과내 재검색 구현 결과내 재검색을 구현 어떻게 할까.. 상품을 검색 할 때 일단 "나이키"로 검색을 하고 그안에서 다시 3000~10000 원 사이의 상품을 검색한다.. 딱 생각나는 것은 두가지 방안인데.. 하나는 쿼리를 다시 생성해서 날리는 방법 즉.. NAME:나이키 로 처음 검색 후 재검색 요청이 들어오면 다시 NAME:나이키 +[PRICE 3000 To 10000] 쿼리를 생성해서 날리는 방법.. 또 하나는 필터를 이용하는 방법이 있을 것 같다... TermQuery nikeTerm = new TermQuery(new Term("NAME","나이키")); ChainedFilter filter = new ChainedFilter(new Filter[] {new RangeFilter("PRICE", NumberTool.. 더보기
[lucene] Hits 메소드가 lucene 다음 버젼에서 사용되지 않는다..? * @deprecated Hits will be removed in Lucene 3.0. * Instead e. g. {@link TopDocCollector} and {@link TopDocs} can be used: * * TopDocCollector collector = new TopDocCollector(hitsPerPage); * searcher.search(query, collector); * ScoreDoc[] hits = collector.topDocs().scoreDocs; * for (int i = 0; i < hits.length; i++) { * int docId = hits[i].doc; * Document d = searcher.doc(docId); * // do somethin.. 더보기
[lucene] 색인 업데이트를 위한 절차.. 루씬을 사용한 증분 색인... 증가된 데이터 뿐만 아니라, 변경된 데이터를 업데이트 해야 할 경우가 많이 생기는데 이때 마땅히 루씬에서 제공되는 API가 없기 때문에 따로 구현을 해줘야 한다. 일단 기본적인 절차는 아래와 같이 정하고... open new IndexReader delete all docs close IndexReader open new IndexWriter add documents close IndexWriter 세부 구현을 고민해봐야 할 듯.. 적절한 색인 주기와 최적화 주기를 선정하는 것도 중요 할 듯.. 색인 서버가 따로 있다면, 그나마 덜 영향을 받게 될테니.. 색인 서버에서 색인을 실시 후 검색 서버쪽으로 색인 파일을 카피해준 후 검색 서버에서는 IndexReader를 다시 호출.. 더보기
[lucene] NumberTools를 이용한 부등호 조건절 구현 (>) 루씬에는 RangeQuery가 있습니다. 날짜검색을 할 때나 가격 구간으로 검색 할때 주로 사용됩니다. PRICE:[20000 TO 30000] 하면 PRICE 필드가 20000에서 30000 사이인 것들이 검색이 됩니다. 그렇다면 PRICE > 30000 이런 상품들을 검색하고 싶다면 어떻게 될까요...? 짧고 무십한 생각으로 PRICE:[30000 TO 9999999] 이렇게도 생각해 봤지만 개념있는 개발자가 할 짓이 아닙니다 -_- 그래서 lucene mailing list에 질문을 보냈고, 루씬인액션 책의 역자 이시자, 예전에 같이 일하셨던 강철구 대리님께 답변을 받았습니다. How about using NumberTools and range query/filters? http://lucene.a.. 더보기
[lucene] IndexReader를 사용한 Term 리스트 얻기. 루씬 메일링 리스트에서 쓸만한 내용이 있기에 정리해봅니다. 문의 내용은 내가 가진 인덱스에서 유니크한 키워드 목록을 얻고 싶은데 방법을 알려달라는 것이었구요.. 간략한 대답이었습니다. IndexReader.terms();를 사용 하면 된다고.. Termenum을 리턴하기 때문에 Termenum.next()와 Termenum.term()을 사용하면 Term의 리스트를 얻을 수 있고 더불어서 IndexReader.docFreq(Term) 메서드를 함께 사용하면 빈도수도 같이 얻을 수 있겠습니다. 한글 Analyzer로 인덱싱 후 어느 키워드가 많이 사용되었는지.. 잘 사용되었는지... 등을 확인할때 좋을듯 합니다. 더보기