메뉴얼(http://wiki.apache.org/solr/DataImportHandler)이 있기는 하지만 직관적이지 않아 이리저리 검색도 해보고 문의해서 정리한다.
 
Window 7
Tomcat 5.5.35,
Apache Solr 3.5.0
Oracle 10g

톰켓 설치 경로
D:\apache-solr\tomcat

/conf/server.xml
<Connector port="8983" ..... URIEncoding="UTF-8" />
포트는 편하신것으로 하면 될듯하다.
Encoding 는 검색할때 Request 호출 시 한글 깨짐을 방지하기 위함이다.(해당 WAS에 따라서 또는 소스레벨에서 적절하게 하면 될듯하다.)

/bin/catalina.bat
set CATALINA_HOME=D:\apache-solr\tomcat
set JAVA_OPTS=%JAVA_OPTS% -Dsolr.solr.home=D:\apache-solr\solr ... 기존 옵션...

/common/lib/ojdbc14.jar 복사하자.(Oracle)

Solr 작동 소스 경로
D:\apache-solr\tomcat\webapps\solr
Apache-solr-3.5.0.zip 파일 하위 dist/apache-solr-3.5.0.war 파일을 solr.war 로 변경하여 복사한다.
Apache-solr-3.5.0.zip 파일 하위 dist/apache-solr-dataimporthandler-3.5.0.jar, apache-solr-dataimporthandler-extras-3.5.0.jar 두 파일을 WEB-INF/lib 하위에 복사한다.
(Solr 설정파일 colrconfig.xml <lib> 설정으로도 할 수 있지만 간편히 복사하자.

Solr 설정파일 경로
D:\apache-solr\solr 
Apache-solr-3.5.0.zip 파일 하위 example/solr 폴더를 복사한다.
/conf/solrconfig.xml
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
    </lst>
</requestHandler>
추가 하자 data-config.xml 파일은 같은경로에 두자.
/conf/data-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource" driver="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:test" user="test" password="test"/>

<document name="products">
        <entity name="item" query="SELECT ID, TITLE FROM TB_DATA">
<field name="id" column="ID" />
<field name="title" column="TITLE" />
        </entity>
    </document>
</dataConfig> 

한글형태소분석기는 http://cafe.naver.com/korlucene/462 를 참조하자.

이제 Tomcat 시작하고
http://localhost:8983/solr/dataimport?command=full-import 하면 인덱싱 된다.
http://localhost:8983/solr/admin 에서 *:* 모두 검색해보자.

 
 
Lucene 2.x 버전에서 3.x 번으로 업그레이드 검토 하던 중 Fastcat이란걸 알게 됐다.

그래서 현재 2.x 로 개발된것과  Fastcat을 동일환경으로 약 13만건의 데이터로 테스트 해본 결과  Fastcat 이 인덱스속도 약 2배, 검색속도 약 100배의 속도차이가 보였다.
(사실 검색속도는 7ms 와 300ms 라서 큰 의미가 없지만, 인덱스속도는 40s와 2m의 차이라서 의미가 약간? 컷다. 로컬환경이라 신뢰도가 떨어질 수 있다.)
* 위 잘못 된비교로 정정, Lucene 3.5 으로 셈플링 한 결과 2.3 버전과 성능면은 크게 다르지 않았다.
* Solr 기반 테스트 시작... 


우선  Fastcat 은  별도의 개발 없이 웹관리자의 셋팅만으로 검색환경 구축이 마무리 되었다.
약 10분이면 셋팅완료!!

Lucene 2.x 으로 개발된 환경이 유지보수로 몇년간 이어오면서 불필요한 오버헤드가 있을것도 감안 해야겠다.
또한 형태소 분석 알고리즘도 다르겠다.

시간 나면 Lucene 3.x 버전으로 셈플링해서 테스트 해봐야겠다.

ps. Lucene이나  Fastcat 모두 크롤링은 지원되지 않는다.

[결과]

데이터 건수 : 130,268건

패스트캣 indexer 소요시간 : 약 45초
루씬 2.3 indexer 소요시간 : 약 2분 패스트캣과 약 2배
루씬 3.5 indexer 소요시간 : 약 2.1분 패스트캣과 약 3배
Solr 3.5 indexer 소요시간 : 약 1.3분 패스트캣과 약 2배

패스트캣 sercher 소요시간 : 약 7밀리초
루씬 2.3 sercher 소요시간: 약 700밀리초 패스트캣과 약 100배
루씬 3.5 sercher 소요시간: 약 187밀리초 패스트캣과 약 26배
Solr 3.5 sercher 소요시간: 약 23밀리초 패스트캣과 약 8배
너무 작은 차이로 의미 없음

데이터 검수 : 529,188건

패스트캣 indexer 소요시간 : 1분 26초
Solr 3.5 indexer 소요시간 : 5분 30초

패스트캣 sercher 소요시간 : 48밀리초

Solr 3.5 sercher 소요시간: 73밀리 


패스트캣 배포/커뮤니티 사이트 - http://www.getfastcat.org/ 

/*
 * jQuery Image rolling Plugin
 * @author 	ddakker
 * @date 	2012-01-30
 * ex)	
* * * ... *
* * * * */ ;(function($) { /** * 상하 이미지 롤링(추후 좌우 추가) * @param viewCount 이미지 보여줄 갯수 * @param delay 이동 주기 * @param duration Effect 지속 시간 * @param btNextId Up,Left 이동 버튼 * @param btPrevId Down,Right 이동 버튼 * @param direction 이동방향 * @param autoRolling 자동 롤링 * @param callbackRollingFun 이미지 롤링 시 호출될 콜백 함수 ex) callbackRollingFun(direction, options.rollingEl, selectedIndex); */ $.fn.rolling = function(viewCount, delay, duration, btNextId, btPrevId, direction, bAutoRolling, callbackMoveFun) { if( this.children().length == 0 ) return; var clickArr = new Array(); var options = {}; var bEffectProgress = false; var autoRollingTimer = null; var clickedProcessTimer = null; options.el = $(this); options.viewCount = viewCount; options.imgCount = options.el.children().length; options.direction = (direction==undefined)?"DOWN":direction; options.delay = delay; options.duration = duration; options.itemWidth = options.el.children().eq(0).width() + Number(options.el.children().eq(0).attr("border"))*2; options.itemHeight = options.el.children().eq(0).height() + Number(options.el.children().eq(0).attr("border"))*2; options.btNextId = btNextId; options.btPrevId = btPrevId; options.autoRolling = (bAutoRolling==undefined)?true:bAutoRolling; options.callbackMoveFun = (callbackMoveFun==undefined)?null:callbackMoveFun;; options.rollingEl = null; options.el.children().each(function(){ if( $(this).attr("onclick") ) $(this).css("cursor", "pointer"); }); this.css("position", "relative"); this.css("overflow", "hidden"); if( options.direction == "UP" || options.direction == "DOWN" ){ this.css("width", options.itemWidth); this.css("height", options.viewCount * options.itemHeight); }else{ this.css("width", options.viewCount * options.itemWidth); this.css("height", options.itemHeight); } options.el.children().wrapAll('
'); options.rollingEl = options.el.children("div"); options.rollingEl.css("position", "absolute"); options.rollingEl.attr("align", "left"); options.rollingEl.css("left", "0"); options.rollingEl.css("top", "0"); if( options.direction == "UP" || options.direction == "DOWN" ){ options.rollingEl.css("height", this.height()*2); }else{ options.rollingEl.css("width", this.width()*2); } options.rollingEl.children().each(function(i){ options.rollingEl.children().eq(i).attr("idx", i); }); if( options.imgCount >= viewCount ){ $("#" + btPrevId).bind("click", function(){ if( options.direction == "UP" || options.direction == "DOWN" ) clickArrAdd("UP"); else clickArrAdd("LEFT"); }).css("cursor", "pointer"); $("#" + btNextId).bind("click", function(){ if( options.direction == "UP" || options.direction == "DOWN" ) clickArrAdd("DOWN"); else clickArrAdd("RIGHT"); }).css("cursor", "pointer"); if( options.autoRolling ){ autoRolling(); this.mouseover(function() { stopRolling(); }).mouseout(function(){ autoRolling(); }); } } // 동작 추가 및 호출 function clickArrAdd(direction){ clickArr.push(direction); stopRolling(); clickArrProcess(); } // 동작 처리 호출 function clickArrProcess(){ if( clickedProcessTimer != null ) return; clickedProcessTimer = setInterval(function(){ if( bEffectProgress == false && clickArr.length > 0 ){ move(clickArr.slice(0, 1), true); clickArr = clickArr.slice(1); } }, 100); } function autoRolling(){ if( clickedProcessTimer ){ clearInterval(clickedProcessTimer); clickedProcessTimer = null; } if( clickedProcessTimer != null ) return; autoRollingTimer = setInterval(function(){ if( bEffectProgress == false ){ move(null, false); } }, options.delay); } function stopRolling(){ clearInterval(autoRollingTimer); autoRollingTimer = null; } // 동작 처리 function move(direction, btClicked){ if( direction ) options.direction = direction; var topMoveSize = 0; var leftMoveSize = 0; if( options.direction == "UP" || options.direction == "LEFT" ){ options.rollingEl.append(options.rollingEl.children().eq(0).clone()); if( options.direction == "UP" ){ topMoveSize = "-=" + options.itemHeight + "px";; leftMoveSize = 0; }else{ topMoveSize = 0; leftMoveSize = "-=" + options.itemWidth + "px";; } }else if( options.direction == "DOWN" || options.direction == "RIGHT" ){ options.rollingEl.prepend(options.rollingEl.children().eq(options.rollingEl.children().length-1).clone()); if( options.direction == "DOWN" ){ options.rollingEl.css("top", (options.itemHeight*-1)+"px"); topMoveSize = "+=" + options.itemHeight + "px";; leftMoveSize = 0; }else{ options.rollingEl.css("left", (options.itemWidth*-1)+"px"); topMoveSize = 0; leftMoveSize = "+=" + options.itemWidth + "px";; } } bEffectProgress = true; options.rollingEl.animate({ top: topMoveSize, left: leftMoveSize }, options.duration, function(){ if( options.direction == "UP" || options.direction == "LEFT" ){ options.rollingEl.children().eq(0).remove(); options.rollingEl.css("top", "0px"); options.rollingEl.css("left", "0px"); }else if( options.direction == "DOWN" || options.direction == "RIGHT" ){ options.rollingEl.children().eq(options.rollingEl.children().length-1).remove(); } bEffectProgress = false; if( btClicked == true && clickArr.length == 0 ){ autoRolling(); } // 롤링 후 콜백 함수 호출 if( options.callbackMoveFun != null ) options.callbackMoveFun("" + options.direction, options.rollingEl, Number(options.rollingEl.children().eq(0).attr("idx"))); }); } }; })(jQuery);
Oracle 10g Client 다운로드 받아 설치 중간에 설치유형으로 "관리자" 를 선택 후 진행한다.

..Disk1\stage\prereq\client\refhost.xml
..Disk1\stage\prereq\client_prereqs\client\refhost.xml

해당 파일을  열어서
<CERTIFIED_SYSTEMS>자식노드로 아래와 같이 추가
<OPERATING_SYSTEM> 
 <VERSION VALUE="6.1"/> 
</OPERATING_SYSTEM> 

..Disk1\install\oraparam.ini 파일을 열어서 아래와 같이 수정
 #Windows=5.0,5.1,5.2,6.0,6.1

Ps. Orange 를 사용할 경우 Instant Client 를 이용할 경우 몇가지 문제가 생긴다. 우선 sqlplus 를 받아야 하고 ORACLE_HOME관련 문제도 생긴다.
인터넷상에 해결 방법이 있는것 같기도 하다. 
Eclipse 에서 Aptana plugin 을 최신으로 업데이트 했더니 svn 비교 에디터 색상이 검색 계열로 바뀌었더군요.
도저히 답답해서 변경 방법을 찾아봤다.

아래 파일에서 설정 변경 할 수 있고, 잘 모르면 삭제 하면 기본 설정으로 나온다.

workspace경로\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.compare.prefs

DROP PROCEDURE IF EXISTS `test_db`.`usp_test`;
CREATE PROCEDURE `test_db`.`usp_test`(in p_b varchar(50))
    READS SQL DATA
BEGIN   
	select * from test where b = p_b;    
END



jsp <%@include file=""%> 방법으로 include 시 접근페이지(?) 를 터치해줘야 내부 include 파일 수정내역이 반영된다.

리눅스나 유닉스에는 touch 명령이가 있어서 편리한데 Windows 기반에는 명령어가 없어서 찾아봤다.

[참고] http://www.abf-dev.com FileDate.exe

 
 
@echo off

echo %date%

set YEAR=%date:~2,2%
set MONTH=%date:~5,2%
set DAY=%date:~8,2%
 
echo 현재 년  : %YEAR%
echo 현재 월  : %MONTH%
echo 현재 일  : %DAY%
 

set HOUR=%time:~0,2%
set MINUTE=%time:~3,2%
set SECOND=%time:~6,2%
 
echo 현재 시  : %HOUR%
echo 현재 분  : %MINUTE%
echo 현재 초  : %SECOND%
 
FileDate *.jsp %MONTH%/%DAY%/%YEAR% %HOUR%-%MINUTE%-%SECOND% /r


MERGE INTO SEARCH_DATA SD
    USING (SELECT COUNT(DATA) AS C FROM SEARCH_DATA WHERE DATA = 'B') S 
    ON (S.C > 0)
 WHEN MATCHED THEN 
    UPDATE SET SD.CNT = SD.CNT + 1
 WHEN NOT MATCHED THEN 
    INSERT VALUES ('B', 1)

[JEUSMain.xml]
    
	
        
            
                oracle
                jdbc/name_test
                
                   oracle.jdbc.pool.OracleConnectionPoolDataSource
                
                ConnectionPoolDataSource
                oracle sid
                
                   This is a sample for database setting.
                
                아이디
                아이디
                1521
                아이피
                
                    driverType
                    java.lang.String
                    thin
                
                true
                Warning
				
                    
                        2
                        30
                        4
                        3600000
                    
					
					true
					10000
					
				
            

			
        
    


[jeus-web-dd.xml]
     
        
            jdbc/name_test
            jdbc/name_test
        
	
     


JEUSMain.xml
    
        jdbc/name_test  
        javax.sql.DataSource
    
    


[스프링 설정파일]
		 
		
	

+ Recent posts