본문 바로가기

루씬

Terms.getSumTotalTermFreq() in Lucene 4.0 소스의 중복도를 체크하는 프로그램의 파일럿을 만들어보려고 새벽 출근한김에 뚝딱거려보았다. 뭐 기본적으로는 루씬으로 색인 후 루씬의 TermFreqVector를 이용해서 코사인유사도를 사용해서 일단 뽑아보는거였는데.. lucene 3.6까지는 TermFreqVector가 있었는데 4.0에서는 그것이 Terms, TermEnum, DocEnum등으로 대체가 된듯 하였다. 그래서 관련한 자료들을 찾아보고테스트 코드를 만들어가면서 이것저것 실행을 해보고 있었는데Terms.getSumTotalTermFreq()의 결과가 영~~ 이상하게 나온다. 계속 -1이 나오는것.. IndexReader로부터 하나의 Document에 대한 Terms 인스턴스를 얻어내면그 Terms의 인스턴스는 딱 하나의 Document가 색인.. 더보기
(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였습니다. 그런데 테스트를 해보면 처음 "무궁화 꽃이 피었습니다." 라고 실행하면 정상적으로 "무궁화" , "꽃"이 추출되어 나오는데 그 다음부터는 "무궁화", "꽃이", "피었습니다." 라고 입력된 키워드가 .. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 - Analyzer (6) - 이번에는 많은 분들께서 기다리셨을(?) 명사 추출 필터입니다. 사전에 등록되어있는 명사를 기반으로 Tokenizer나 선행 TokenFilter로 부터 넘어온 Token을 탐색하여 명사를 추출해내는 구조입니다. 기대를 하셨다면 죄송스럽게도 굉장히 별거 없는 Filter입니다. 형태소 분석이 아닌 단순히 Token을 읽어 사전에 있는 단어를 추출하는 방식입니다. Token탐색도 그냥 character단위로 쭉.... 합니다. 이걸 다른 자료구조형으로 만들면 속도를 빠르게 할 수도 있겠지만 여기서는 코드의 간결함을 위해서 복잡한 부분은 모두 제외를 시킬 예정입니다. 이 추출의 과정이 형태소분석을 기반으로 알고리즘이 만들어져 있다면 이 Filter가 형태소분석기가 됩니다. 하지만 이 형태소분석이라는 것이 쉬운.. 더보기
현재 사용중인 루씬쪽.. 약간의 변경 작업 로그분석/조회 프로그램에 대한 루씬쪽 약간의 변경작업.. 1. 전체 document 약 2억6천만개 - 하루 약 40만개씩 증가 - 색인파일 연도별로 분리 - MultiSearcher 사용 2. 검색속도 개선을 위한 작업 - date필드를 int형 필드로 마이그레이션 - value 필드를 int형 필드로 마이그레이션 - rangeQuery를 Filter로 변경하여 검색 3. 리소스 개선을 위한 작업 - long타입을 int로 마이그레이션 까지는 완료... 4. 더 할 수 있는 작업 - 색인 조건 최적화 - TermVector, Norm값등은 필요 없으므로 가지고 가지 않도록 5. replication 기능 개발 역시 책을 읽어야해...;; 1판에 있던 내용도 지금 다시 읽으니 참 새롭다. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 - Analyzer (5) - 이번에는 동의어 필터를 만들어보겠습니다. 동의어의 역할은 다 아시겠지만 특정한 키워드에 대해서 확장된 검색을 지원 할 수 있도록 해줍니다. 이 예제도 앞선 예제들과 마찬가지로 루씬인액션의 책에 있는 예제를 보고 우리 상황에 맞춰 다시 만든 코드들입니다. 먼저 테스트 케이스를 보겠습니다. DevysSynonymFilterTest.java 테스트 케이스는 양방향으로 검사를 하고 있습니다. 동의어 목록을 미리 지정해두고 TokenFilter로부터 나오는 Token을 리스트와 비교.. 그리고 이 Token을 따로 저장해두고 다시 동의어 목록을 가지고 비교합니다. 예를 들어서 동의어가 "노트북, notebook, 노트북PC"로 등록되어 있다면 3개 중 하나의 키워드가 검색쿼리로 들어온다고 해도 동의어로 등록된 3.. 더보기
3년전 내가 읽던 "루씬인액션" 초판 번역본.. 글 쓰다가 좀 애매한 부분이 있어서.. 3년전에 공부 할 때 읽었던 루씬인액션 초판 번역본을 꺼내보았다. 루씬 1.4를 기반으로 쓰여진 루씬인액션 초판 번역본이다. 책장에서 책을 꺼냈는데 책에 붙어있는 인덱스들이 눈에 들어왔다. 책을 열어보니 여기저기.. 지금보면 나는 또 모를 얘기들이 연필이고 볼펜으로 적혀있었다. 나는 3년전 그때 당시 팀장님과 추경돈대리님의 명(?)을 받고 검색에 "검"자와 자바의 "자"자도 모르면서 뭘 만들어보겠다고 이렇게나 열심히 공부했을까.. 싶은 생각이 든다. 이 책 번역해주신 이문호님께서는 가끔 블로그에 좋은 댓글을 남겨주시고.. 내가 작성한 포스트에 오류가 있으면 지적해주셔서 수정 할 수 있게 도와주시기도 한다. 또 한분의 역자이신 강철구님과는 루씬 user group에서.. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 - Analyzer (2) - 그러면 이제 루씬에서의 Analyzer에 대해서 살펴보도록 하겠습니다. 이제부터 정말 작성하기가 조심스러워지네요... 저도 루씬을 잘 이해하고 있는 상태는 아니라서.... ㅎㅎ 더군다나 제가 공부하며 만들었던 루씬 버전이 2.4 정도 버전인데 현재 3.3 버전은 기본적인 개념은 비슷하겠지만 내부적은 구현 방식은 완전히 바뀌었더라구요... 앞으로 내부적인 루씬 소스에대한 설명보다는 주로 사용법/커스터마이즈 방법을 소개해드리게 될 것 같습니다. 우선 Analyzer가 어떻게 사용되는지 보도록 하겠습니다. AnalyzerUsageSampleTest.java 우선 분석 할 문장을 StringReader로 생성하고, 이 문장을 분석 할 Analyzer를 생성합니다. 여기서는 WhitespaceAnalyzer를 이.. 더보기
[about Lucene] 루씬으로 검색엔진 개발하기 - Analyzer (1) - 앞에 데모 프로그램을 보셔서 아시겠지만 검색이라는 하나의 작업을 위해서는 크게 색인과 검색이라는 2가지 프로세스를 거쳐야 합니다. 이중 색인과 검색에 모두 관여하는 것이 하나 있는데 그것이 바로 키워드 추출.. 즉, 흔히 이야기하는(하지만 너무나 어려운) 형태소분석입니다. (이후에는 키워드 추출이라고 하도록 하겠습니다.) 잠깐 루씬을 떠나서 검색이론에 대해서 이야기 해 보겠습니다. 흔히 검색에서 이야기하는 색인 파일은 대부분 "역색인(Inverted Index)" 구조로 되어있습니다. 이게 어떤 구조인가하면.... 책의 맨 뒤 부록에 나오는 "단어"를 기준으로 페이지를 나열한 형태의 색인 구조라고 보시면 됩니다. 나이키 - Doc1, Doc2, Doc3 운동화 - Doc1, Doc5 청바지 - Doc6.. 더보기