xrath.com에 Lucene으로 검색엔진 붙였다.

2 min read

좌측 내 얼굴 :$ 밑에 조그마한 검색창을 하나 넣어놨다.

드디어 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

01

래쓰님 덕에 저도 검색 기능 잘 붙였어연 ㅋㅋㅋㅋ ㄱㅅㄱㅅ~

02

서문교

완전 멋있네요. 저도 서버 업글하면 붙여봐야겠어요

03
J

Jenix

오옹~ jenix 검색어 넣어봤는데 0.001초! ㅋㅋ

04
R

rath

솥: 캘린더 보면서 의욕 만땅 댔어연. ハイバ 놀이 넘 잼나요 ㅎㅎ

05
R

rath

뭉고: 우리 서로 지식 교환하고 놀장. 나 Django 갈켜줘 갈켜줘~

06
R

rath

Jenix: '제닉스'로 검색하시면 블로그 글 하나 나와요 ㅎㅎ 0.001초 저 기준은 Lucene에서 쿼리 만들고 search 하고 나온 결과 Document array로 만들어서 리턴하는데 소요되는 시간인데 뭐 장비가 좋은건지 어떤건지 50만건 넣어도 0.03초 정도~ ㅎㅎ

07

앞이나, 뒤에 스페이스가 들어가면 에러가 발생해요 :)

08

앞은 파싱에러, 뒤는 힙... -_- 그나저나 루센 좋네요 !

09
R

rath

앗 테스트 감사합니다! 얼른 고쳐야겠네요~ ^_^;

10
R

rath

뒤에 스페이스 힙-_-;; 정말 충격입니다. 아이고 아이고 (@);;

11
R

rath

간단하지만 치명적인 에러였네요 따옴표로 묶어서 넣는 검색어를 처리하기 위해 StringUtil.split을 따로 만들었었는데 ' 음' 을 split 하면 '' 와 '음'이 나오게 되어있었고 그래서 앞에 공백이 붙으면 Query 만들 때 (subject:"" AND content:"") 이 되버려서 파싱 에러가 나고, 그걸 통과했을지라도 웹에서 빈 문자열을 가지고 로직을 돌다가 무한룹에 빠져서 -_-; 죽어버렸었네요 -

각 문자열 처리 루틴에 length 체크 넣고 split 새로 짜서 해결했습니다~

12
R

rath

그나저나 정말 Lucene 좋아요~! (H)

Continue Reading

Discover more thoughts and insights