본문 바로가기

Lucene

[about Lucene] SearcherManager 루씬 3.5버전부터 제공되는 유틸리티성 클래스입니다. IndexSearcher의 재사용과 IndexWriter로 변경된 인덱스를 새로 가져오기 위해 저런 매니저 클래스를 매번 새로 만들어서 사용했었는데 아예 3.5 버전부터 제공이 되어 나오네요. (Lucene in Action 2판에도 소개가 되어있습니다. 361P) 여러 스레드가 IndexSearcher 인스턴스를 안전하게 열고 닫고 하면서 사용 할 수 있는 기능을 제공하여 줍니다. acquire/release API를 제공하며, IndexReader를 열고 닫기 위한 병렬처리의 복잡함을 알아서 처리해주도록 구현이 되어있습니다. 3.5버전과 3.6버전에서 SearcherManager 인스턴스를 생성하는 방법이 조금 바뀌었는데요.. (생성자의 파라메터가.. 더보기
(Lucene) 짤막한 정리 회사에서 개발해서 사용 중인 모니터링 시스템 관련 디버깅하다가잠깐 짤막한 정리 IndexWriter는 하나로 유지하면서 close 없이 Incremental indexing을 계속 실행하고IndexSearcher는 IndexWriter로부터 IndexReader를 받아와서 새로 생성하면변경된 사항을 IndexWriter의 commit 여부 상관없이 적용된 Document의 수정 사항을가져 올 수 있다. 다만 매번 IndexSearcher를 생성하는 것은 부담이 되기 때문에IndexReader를 체크하여 changed여부를 확인한다. 이러한 롤을 가지고, Searcher Pool을 운용해도 좋을 것 같다는 생각이 들기도 하고... Document수가 많지 않으면그냥 매번 생성하는 것도 나쁘지 않을 것 같고.. 더보기
[Lucene] 3.5 IndexReader reopen이 deprecated 되었습니다. NearRealTimeSearch를 구현하는데 사용되던 메서드인 IndexReader reopen 메서드가 deprecated되고 static openIfChanged(IndexReader ir) 메서드로 대체 되었습니다. IndexReader newReader = IndexReader.openIfChanged(oldReader); oldReader가 변경되었다면 새로운 Reader를 반환하고 아니라면 null을 반환합니다. 이때 oldReader와 동일한 타입이 넘어옵니다. MultiReader라면 MultiReader가 넘어오게 됩니다. 더보기
[Lucene] Analyzer의 reusableTokenStream 댓글로 질문을 하신분이 계셔서 그 내용을 확인하고 답변을 드리기 위해서 포스트를 작성합니다. 질문하신 내용은 Custom Analyzer를 만들어서 사용하는데 실제로 원하는대로 작동을 하지 않는다는 것이었습니다. Custom Analyzer의 로직은 아래와 같습니다. 즉, 사용자에게 입력받은 키워드를 별도로 준비된 형태소분석기를 통해서 명사를 추출하고 이 추출된 명사의 위치정보와 기타 루씬의 Filter를 적용하기 위하여 이를 다시 StandardAnalyzer로 분석하는 CustomAnalyzer였습니다. 그런데 테스트를 해보면 처음 "무궁화 꽃이 피었습니다." 라고 실행하면 정상적으로 "무궁화" , "꽃"이 추출되어 나오는데 그 다음부터는 "무궁화", "꽃이", "피었습니다." 라고 입력된 키워드가 .. 더보기
tf-idf를 사용한 문서 유사도 관련 http://codezip.tistory.com/429 더보기
[Lucene] MultiReader의 사용 정확히 어느버전 부터인지는 모르겠으나 제가 사용하고 있는 루씬 3.3.0 버전에서는 MultiSearcher 클래스가 deprecated 되어있었습니다. 내용을 보면 NumericRangeQuery 부분이 문제가 있는 듯 합니다. https://issues.apache.org/jira/browse/LUCENE-2756 때문에 기존에 사용하던 MultiSeacher 대신 MultiReader의 사용을 권하고 있네요. 기본적으로 IndexSearcher를 생성시 IndexReader를 넘겨줄 때 MultiReader를 넘겨주는 방식으로 사용하시면 될 것 같습니다. 기존에는 Searcher를 여러개 만들어서 MultiSearcher를 생성하는 방식이었지만 이것은 Reader를 여러개 만들어서 IndexSear.. 더보기
[Lucene] coord와 Match Term 가져오기 방명록에 남겨진 질문 중 하나에 대한 답을 찾아보려고 이것저것 해보다가 우선 생각나는 방법이 있어서 적어보려고 합니다. 질문의 내용은 루씬의 Explain에서.. 0.5987479 = (MATCH) product of: 1.4968698 = (MATCH) sum of: 0.7484349 = (MATCH) weight(label:시크릿 in 0), product of: 0.40649435 = queryWeight(label:시크릿), product of: 2.9459102 = idf(docFreq=1, maxDocs=14) 0.13798599 = queryNorm 1.8411939 = (MATCH) fieldWeight(label:시크릿 in 0), product of: 1.0 = tf(termFreq(l.. 더보기
[Lucene] 한글명사 추출 Analyzer 입니다. 이번에 공개소프트웨어 개발자 대회에 출품하였다가 1회전 낙방한 한글명사 추출 Analyzer입니다. 형태소 분석 알고리즘은 들어있지 않고 String Scan 형식으로 사전과 Match되는 명사를 추출하고 동의어사전, 복합명사사전, 불용어사전등을 사용하여 루씬의 Analyzer와 Filter의 사용으로 여러 기능을 구현하고 있습니다. 형태소분석까지는 무리더라도 Scan을 좀 빠른 속도와 효율적인 알고리즘, 자료구조로 바꿔보고 싶은 욕심은 있습니다. 형태소분석 기능이 들어가면 더할나위 없이 좋겠지만 제가 형태소분석에 대한 지식이 없어서 구현은 하지 못 하였습니다. 소스는 github를 사용하여 관리하고 있습니다. 한글명사 추출의 기능적인 면보다도 어쩌면 Analyzer와 Filter의 사용에 대한 공부에 .. 더보기
[Lucene] Lcuene Score 잘 정리된 링크 http://lucene.apache.org/java/2_9_1/scoring.html http://lucene.apache.org/java/2_9_1/api/core/org/apache/lucene/search/Similarity.html http://www.lucenetutorial.com/advanced-topics/scoring.html 누군가 질문을 하셔서 전부터 한번 깊게 공부해보고 싶던 Lucene Score를 조금씩 보고 있습니다. 우선 루씬에서의 Score 공식을 아래와 같습니다. Lucene의 Score 공식 score(q,d) = Sigma(t in q)(tf(t in d) * idf(t)^2 * getBoost(t in q) * getBoost(t.field in d.. 더보기
[about Lucene] 예제소스를 github.com에 올려놓았습니다. 이래저래 공부도 해볼 겸 aboutLucene의 예제 소스를 https://github.com/need4spd/aboutLucene 으로 repository를 변경하였습니다. 더보기