좌측 내 얼굴 밑에 조그마한 검색창을 하나 넣어놨다.
드디어 xrath.com에 Lucene을 붙였다~! 웹 검색 인터페이스는 구글 인터페이스의 외형만을 조금 따라했다. 검색 범위는 블로그 내용, 블로그 코멘트 그리고 타자방 문장이다.
개발한 것은 Lucene을 이용하여 만든 검색서버인 rath-search-daemon.jar와 검색서버와 붙일 때 사용할 경량 클라이언트인 rath-search.jar로 구성된다.
-rw-r--r-- 1 rath dev 44112 1월 18 16:44 rath-search-daemon.jar
-rw-r--r-- 1 rath dev 10440 1월 18 16:44 rath-search.jar
이름을 좀 잘 지었어야 하는데 -_-; 이름 정하는데 너무 많은 시간이 들이는 것이 아까워 그냥 했다.
총 검색할 범주가 3개라서 좌측 메뉴의 검색은 통합검색이다. 블로그에서 몇개 코멘트에서 몇개 타자방에서 몇개.. 최근 8, 15, 15개만 보여주고 '더 많은 XXX 보기'를 누르면 범주별로 보면서 페이징을 할 수 있다.
검색 클라이언트와 daemon간의 TCP 통신에서 SEARCH 요청은 아래와 같은 프로토콜을 사용한다.
<= SEARCH $(category) $(offset) $(length) $(sortOption) $(type) keywords
=> RESULT $(count) $(total) $(timeInMillis) $(optional result-length)
요청했을때의 type이 text였으면 RESULT 이후에 결과를 text로 막 뿌리게 되어있고 type이 java이면 org.apache.lucene.document.Document 클래스를 담고 있는 java.util.List를 ObjectOutputStream으로 Serialize 하여 통째로 보내버린다.
나중에 type에 xml, python-pickle, ruby-marshall 이런거 넣어도 좋겠다 ㅎㅎ 글 추가/수정/삭제는 rath-search.jar 클라이언트에 IndexUtil.add/update/remove(String category, String id) 메서드를 만들어 기존 페이지들을 간단히 마이그레이션 할 수 있었다.
월요일 새벽 3시경 awkn님이 던져주신 문서로 Lucene 공부를 시작해서 만 3일간의 대장정이 드디어 끝났다. 제대로 공부해야겠다는 생각에 매닝의 '루씬 인 액션' 책도 샀지만 이것저것 삽질하고 공부하느라 아직 책은 한 페이지도 못봤다. 이제 다시 봐야지 -_-;
이제 간단히 붙여보는 연습이 끝났으니 루씬에 대해 더 공부해야겠다. 사논 책도 보고 좀 더 리서치 해봐야겠지만, 살짝 범용으로 좀 더 가다듬어서 웹페이지 말고도 MSN 대화기록에서 검색을 한다던지, 한글 검색 비리리하니까 소스 코드 내 검색을 한다던지.. 등으로 활용해봐야겠다.
암튼 붙여서 기분이 매우 좋다! ㅎㅎ
Comments
12 thoughts shared
솥
래쓰님 덕에 저도 검색 기능 잘 붙였어연 ㅋㅋㅋㅋ ㄱㅅㄱㅅ~
서문교
완전 멋있네요. 저도 서버 업글하면 붙여봐야겠어요
rath
솥: 캘린더 보면서 의욕 만땅 댔어연. ハイバ 놀이 넘 잼나요 ㅎㅎ
rath
뭉고: 우리 서로 지식 교환하고 놀장. 나 Django 갈켜줘 갈켜줘~
rath
Jenix: '제닉스'로 검색하시면 블로그 글 하나 나와요 ㅎㅎ 0.001초 저 기준은 Lucene에서 쿼리 만들고 search 하고 나온 결과 Document array로 만들어서 리턴하는데 소요되는 시간인데 뭐 장비가 좋은건지 어떤건지 50만건 넣어도 0.03초 정도~ ㅎㅎ
개
앞이나, 뒤에 스페이스가 들어가면 에러가 발생해요 :)
개
앞은 파싱에러, 뒤는 힙... -_- 그나저나 루센 좋네요 !
rath
앗 테스트 감사합니다! 얼른 고쳐야겠네요~ ^_^;
rath
뒤에 스페이스 힙-_-;; 정말 충격입니다. 아이고 아이고 ;;
rath
간단하지만 치명적인 에러였네요 따옴표로 묶어서 넣는 검색어를 처리하기 위해 StringUtil.split을 따로 만들었었는데 ' 음' 을 split 하면 '' 와 '음'이 나오게 되어있었고 그래서 앞에 공백이 붙으면 Query 만들 때 (subject:"" AND content:"") 이 되버려서 파싱 에러가 나고, 그걸 통과했을지라도 웹에서 빈 문자열을 가지고 로직을 돌다가 무한룹에 빠져서 -_-; 죽어버렸었네요 -
각 문자열 처리 루틴에 length 체크 넣고 split 새로 짜서 해결했습니다~
rath
그나저나 정말 Lucene 좋아요~!
Continue Reading
Discover more thoughts and insights
Acer의 Android Netbook이 도착했습니다.
Acer가 만든 10.1인치 안드로이드 넷북을 구입하였습니다. Acer가 빌드한 안드로이드라 조금 커스터마이징이 되어있습니다. 박스를 뜯고 바로 전원을 넣으면 안드로이드가 뜨지 않고 윈도우즈 XP가 뜹니다.
취업 결심 후 보름
국내 취업을 결심한 지 보름이 지났다. 구인공고가 매력적으로 보여 지원했던 그 회사는 안타깝게도 내가 그 회사 인사팀의 채용 프로세스를 더 이상 납득할 수 없는 상황에 이르러 결국 지원취소 메일을 보냈다. 오늘은
결혼식 사회보다
9월 12일은 이프리트의 결혼식이였습니다. 축가를 부르기로 했었는데, 도착해보니 사회자가 없다고 사회를 보라고 하더군요 -.-; 어리버리하면서 사회를