페이스북 그룹 중 serverside group을 아시나요?


이름만들어도 쟁쟁하신 분들이 좋은 정보와 자료 그리고 토론들을 통해

많은 정보들을 제공받을 수 있는 페이스북 그룹입니다.


https://www.facebook.com/groups/serverside/


저도 가입해서 눈팅을 주로하고 있는데

페이스북의 특성상 과거의 자료를 찾기가 너무나 힘들어서

crescent로 이 그룹의 피드들을 오늘날짜까지 색인을 해보았습니다.


원래 crescent 데모버전이 올라가있던 AWS에 색인했고

정기적으로 색인이 돌고있지는 않습니다.


사용을 많이 하시게 된다면, 커멘트색인, 작성자색인등도 추가 가능하겠지만...

아직은 그냥 올려두기만 했습니다.


검색방법은


1. http://ec2-54-248-115-161.ap-northeast-1.compute.amazonaws.com:8080/crescent/searchTest.devys?col_name=serverside 에서 키워드에 검색어를 넣고 검색..

2. http://ec2-54-248-115-161.ap-northeast-1.compute.amazonaws.com:8080/crescent/search.devys?col_name=serverside&keyword=nosql 로 결과를 json으로 받음


두가지입니다.


야밤에 갑자기 왜 이런게 하고 싶은지.. -_-;;; 이제 자야겠네요..아오...

저작자 표시 비영리 변경 금지
신고
Posted by 용식
TAG Crescent

추출된 키워드에 대해서 정규식 검색 기능이 추가되었습니다.

파라메터는 rq를 사용합니다.


예 : rq="[0-8]+$"


음... 딱히 더 말씀드릴건 없네요..^^;


루씬의 RegexQuery 클래스를 사용하며, 다른 쿼리들과 연동됩니다.

저작자 표시 비영리 변경 금지
신고
Posted by 용식
TAG Crescent



1. Analyzer 설정 분리 

 - 색인/검색용 Analyzer를 따로 설정 할 수 있습니다.


2. Analyzer 동적생성

 - 기존에는 KoreanAnalyzer가 하드코딩되어 사용되었는데요, 이번에 위 설정을 통해서 Analyzer를 collection별로

다이내믹하게 생성하여 사용합니다.

저작자 표시 비영리 변경 금지
신고
Posted by 용식
TAG Crescent

요 몇달간 실제로 crescent를 사내에 포팅하고 사용하면서 자잘하게 나오던 문제들을 수정을 했었습니다.


1. was 구동시 -DcrescentHome 파라메터로 collections.xml 파일의 경로 지정

 - war 배포가 기본이다보니, 기본 경로인 클래스패스에 collections.xml이 들어가 있으니

수정/reload등에 제약이 많아 별도 디렉토리에 설정파일을 위치시키고 읽을 수 있도록 수정하였습니다.

 - 이것때문에 embedded DB를 쓰느니, 삽질 많이 했는데.. solr가 이런 형태로 사용하더라구요.. -.-ㅋ

 - https://github.com/need4spd/crescent/wiki/02.-How-to-Start-Server


2. update를 한번에 한건씩만 가능하도록 걸려있던 제약을 풀었습니다. 

 - lucene에서의 update는 delete and insert로 동작합니다. 특정 쿼리에 대해 검색되는 document에 대해서 어떤 형태로던 update를 할 수 있습니다.


3. indexing command에 update_by_field_value command를 추가하였습니다.

 - bulk indexing을 대체하기 위해서 만들었습니다. 하루한번 대량의 데이터 변경이 있고 이 데이터의 변경이 기존 데이터의 변경/ 새로운 데이터의 추가 (즉, insert or update)가 필요한 경우에 위 command를 사용하면 조건에 맞는 document는 update가 되고, 맞지 않는 document는 새롭게 insert가 됩니다.

 - https://github.com/need4spd/crescent/wiki/05.-Indexing-File-Format


4. Highlighter를 FastVectorHighligher로 변경하였습니다.

 - 기존의 Highlighter가 검색시 상당한 병목을 일으키는 것이 확인되어 FastVectorHighlighter로 수정하였습니다.

 - Lucene 4.X에서는 새로운 Highlighter가 있다고 하는데 확인은 해보지 못 했네요. ^^


5. file system으로부터 indexing format을 만드는 util 클래스하나를 추가하였습니다.

 - 사내 소스 개발 시스템을 만들려고하다보니 위와 같은 클래스가 하나 있으면 좋을 것 같아서..

간단하게 추가하였습니다.

 - 아마 그대로는 사용하기는 좀 어려우실거고 약간의 커스터마이즈가 필요하실듯 합니다.

 - https://github.com/need4spd/crescent/wiki/10.-Create-Json-Form-File


6. 강한구님께서 index 파일 관리페이지 초안 개발을 완료하셨습니다.

 - 감사합니다. :)


7. JSP 페이지가 모두 JSTL 사용으로 변경되었습니다.


저작자 표시 비영리 변경 금지
신고
Posted by 용식
TAG Crescent

새벽에 일어나서.. Filter 기능을 추가하였습니다.


### Crescent에서는 Query보다 더 빠른 검색을 위해 Filter를 제공합니다.

### 형태는 CustomQuery와 동일한 문법을 사용합니다.

### 파라메터명은 ft입니다.


예제>

search.devys?col_name=sample&keyword=나이키&ft=title:"운동화"


search.devys?col_name=sample&keyword=나이키&ft=create_date:"[20120101 TO 20120130]"


쿼리와의 차이점은 검색에서 제외되는 document들이 ranking을 결정하는데 영향을 주냐 안 주냐의 차이입니다.

예를들어 아래와 같이 2개의 document가 있다고 가정하면..


1) 장소:"한국", "서울" 본문:"저는 서울에 삽니다.", "서울 좋아요"

2) 장소:"서울 노원", "서울 남대문", "서울" 본문: "저는 서울이 좋아요"


query=+장소:"서울" +본문:"서울" 

일 경우에는 2번의 document가 1번보다 높은 점수를 받습니다. "서울"이라는 단어의 빈도수가 더 많기 때문입니다.


하지만, 아래의 쿼리

query=+본문"서울" flter=+장소:"서울"

의 경우는 1번의 document 점수가 더 높습니다. 왜냐하면 장소는 ranking을 계산하는 로직에서 제외되고

본문으로만 점수가 결정되는데, 1번의 document의 본문이 더 짧기 때문입니다. (같은 term freq일 경우 해당 문서의 내용이 짧을수록 점수가 높습니다.)


다만, 특정 필드로 정렬을 하는 경우에는 위와같이 ranking에 영향을 받는 경우는 없을것이지만 속도나 캐시측면에서

filter를 사용하는 것은 괜찮은 방법입니다.


그리고, 클래스명에 오타가 있는 것 하나 수정...


저작자 표시 비영리 변경 금지
신고
Posted by 용식

crescent의 색인로직이 수정되었습니다.


1. indexing json format이 변경되었습니다.

https://github.com/need4spd/crescent/wiki/05.-Indexing-File-Format


2. indexing Type에 따라서 indexing 후 commit의 수행여부가 결정됩니다. bulk indexing에만 commit을 실행합니다. commit을 하지 않아도, 아래 3번의 스레드에 의해서 주기적으로 update된 내용이 IndexSearcher로 반영됩니다.


3. SearcherManager.mayberefresh() 메서드를 주기적으로 실행하는 백그라운드 스레드가 기동되며, collections.xml에 스레드의 수행 주기를 설정 할 수 있습니다. (minute)


4. 관련된 테스트 케이스가 추가되었습니다.


저작자 표시 비영리 변경 금지
신고
Posted by 용식

crescent에 커스텀 쿼리 기능을 추가하였습니다.

그냥 단순하게 사용 할 경우에는, collections.xml에 defaultSearchField를 지정해놓고

keyword만 날려서 검색을 하거나, search_field 파라메터에 필드를 넣어서 검색을 하면 됩니다.



col_name=sample&keyword=나이키&page_num=1&page_size=50&sort=id_sort desc,name_sort asc&search_field=name,id


여기서 좀 더 쿼리식을 원하는대로 만들어서 검색하고 싶어하는 사용자를 위해 Custom Query 기능을 넣었습니다. 기본적으로 Lucene의 쿼리 Syntax를 사용합니다.


문법은

[+|-]필드명:"키워드" 혹은

[+|-]필드명:"[min To max]" 입니다. 


쿼리문 예제

  1. title:"청바지" dscr:"나이키" (title=청바지 or dscr=나이키)
  2. title:"청바지" +dscr:"나이키" (title=청바지 and dscr=나이키)
  3. price:"[1000 TO 100000]" (price between 1000 and 100000)
  4. title:"청바지" dscr:"나이키" +price:"[1000 TO 100000]" (title=청바지 or dscr=나이키 and (price between 1000 and 100000))


가중치를 주고 싶을 때는 아래와 같이 사용합니다.

title:"청바지^10"

만약에 collections.xml의 설정에 title 필드에 대해서 가중치가 이미 설정되어 있다면, custom query의 가중치 수치와 더해지게 됩니다.

range 검색식을 지원합니다.

+price:"[1000 TO 100000]"

range query에서 [는 한계값을 포함하며, {는 한계값을 제외힙니다.
아래의 식은
+price:"[1000 TO 100000}"
다음과 같이 해석됩니다.
and price >= 1000 and price > 100000

cq파라메터를 사용하여 검색을 요청합니다.
cq=title:"청바지" dscr:"나이키" +price:"[1000 TO 100000]"

cq 조건이 들어올경우 keyword, search_field 파라메터의 값은 무시됩니다.



저작자 표시 비영리 변경 금지
신고
Posted by 용식

둘째가 태어난 이후로..

밤 10시에 잠들고, crescent 개발은 주로 새벽/점심을 이용해서 하고 있습니다 -_-;


관리자 페이지를 좀 개선해보았습니다.

우선, 색인의 기본이 되는 collection.xml 설정 페이지입니다.



각 필드의 색인, store, term vector등의 설정과 인덱스 파일 경로등의 설정, 필드추가등의 작업을 할 수 있는 페이지입니다. 원래 xml 파일을 직접 수정해야했는데.. 제가 불편해서 못 쓰겠더라구요 -_-



사전관리 페이지입니다.


각 사전을 탭메뉴로 변경하고, 테이블을 조금 조정하였습니다.

아직 내부적으로는 개선의 여지가 많은 페이지이긴 합니다...


형태소분석 테스트 페이지입니다.


결과를 테이블로 수정하였고, 색인용/검색쿼리 분석용으로 나눠서 결과를 보여줍니다.

분석된 단어의 타입과 위치정보를 기본으로 보여줍니다. 타입이 아직은 많이 부정확합니다.


검색 테스트 페이지입니다.


검색 테스트를 본래 url 쿼리스트링으로 만들어서 해보는 수 밖에 없었는데, 페이지로 하나 만들어보았습니다.



아직 미구현된 페이지이기는 한데 인덱스 파일 관리 페이지입니다.


컬렉션별로 인덱스 파일의 정보를 보고, 관리 할 수 있는 페이지입니다.

Luke를 좀 본따봤습니다. 


그리고 통계페이지가 아직 남았는데.. 검색엔진에서 통계 기능을 기본적으로 제공하는 것이 맞나 싶었는데..

제공해줘도 나쁘지 않을 것 같아서.. 대용량까지는 아니고.. 그냥 기본적은 통계 기능을 만들어볼까 합니다.

다만.. 아직 개선/수정 할 것이 많아서... 우선 순위는 좀 밀릴 것 같네요..


너무 느긋한가.. 싶기도한데.. 내부적으로 사내에서 후배 두명을 대상으로 1주일에 두번정도 루씬을 가르치고 있습니다. 이 프로젝트에 같이 넣으려고요...ㅎㅎㅎ 혼자하는것보다 힘든것도 많겠지만.. 재미있을것 같아서요.. :)


http://ec2-54-248-115-161.ap-northeast-1.compute.amazonaws.com/adminMain.devys

저작자 표시 비영리 변경 금지
신고
Posted by 용식
TAG Crescent

Crescent : http://ec2-54-248-115-161.ap-northeast-1.compute.amazonaws.com/adminMain.devys


강한구님 덕분에 일취월장한 UI -_-b



올해 두번째로 참가하였던 공개소프트웨어 개발자대회에

1차 심사를 통과 후 2차 심사에서 또다시 낙방하였다.


올해도 두손에 참가확인증을 꼬옥~~ 쥐게 되었다.


작년에 떨어지고 "볼륨이 너무 작았나..그러고보니 보여 줄 화면이 하나도 없었네..." 라는 생각을 하면서 다시 도전하였는데 아무래도 비슷한 실수(?)를 또 하지 않았나싶다.


검색엔진이라는 것을 만들고.. 이것을 PR을 해야하는데..

이번에 완성된 버전으로는 보여줄게 참 없었구나.. 싶은 생각이 들었다.


검색엔진이 색인/검색만 되면 되지.. 이게 아니라..

내가 이걸 만들기 시작한 이유.. 검색 서비스 개발 및 운영 6년의 노하우를 살려

사용자가 쓰기 쉽고 필요한 기능들을 직접 구현해보고 싶었던..


그러한 내용들이 기능에도.. PPT 발표시 내용에도 많이 빠져있었다는 생각이 떨어지고 나서야 들었다. -_-;

깨달음이 너무 빠른게지.....


그래서, 수~~ 많은 기능개선 리스트중에서 일단 누구나 들어와서 한번 볼 수 있는

그런 페이지를 먼저 만들어 놓자.. 라는 생각이 들었다.


어차피 AWS 놀고있는거..

이거 사용해서 한번 열어놓자. 싶어서.. 일단 틀을 좀 만들었다.

강한구님께서 잡아주신 Bootstrap 틀을 좀 수정해서.. 일단 commit.


단기 목표는 이 관리자 및 테스트 페이지의 기능 구현.


http://ec2-54-248-115-161.ap-northeast-1.compute.amazonaws.com/adminMain.devys


현재까지 구현된 것은 사전관리, 형태소분석 테스트..


추가적으로..

인덱스 파일을 조회 할 수 있는 (텀과 텀 개수등.. Luke와 비슷한 이미지로..) 화면과

collections.xml을 수정하고 관리 할 수 있는 페이지 (스킴 관리)

검색을 직접 해볼 수 있는 페이지 (현재 개발 중)를 붙여보려고 한다.


내년 대회때 입상하지 못한 프로그램에 대해서 베스트 업그레이드상 지원이 될지 모르겠지만

암튼... 그것과 상관없이 누가봐도 그럴듯한 모습은 좀 갖춰놓고 싶어졌다.


이제 올해는 좀 쉬며 마무리하고..

내년을 기약하며~ 아침에 병원가야하는데 빨랑 자야지... 


https://github.com/need4spd/crescent





저작자 표시 비영리 변경 금지
신고
Posted by 용식

[Crescent] 11월 5일 기능 추가 및 수정 내용


1. NRTManager 적용

 - Near Real Time 검색을 위한 NRTManager를 적용하였습니다.

이에 따라, IndexWriter는 TrackingIndexWriter로 전환되었으며, 색인 후 commit/ close를 하지 않고

단일 인스턴스로 계속 사용하게 됩니다.

2. IndexWrtierManager 개발

- Collection별 TrackingIndexWriter의 단일객체 사용 지원을 위해 IndexWriterManager를 추가하였습니다.

저작자 표시 비영리 변경 금지
신고
Posted by 용식