본문 바로가기

엔지니어/Linux

Solr 설치 및 data import

728x90
반응형
  http://archive.apache.org/dist/lucene/solr/5.5.2 다운로드
(http://archive.apache.org/dist/lucene/solr/5.5.2/solr-5.5.2.tgz)

    압축해제 solr-5.5.2.tgz
   /usr/local로 solr 폴더로 이름변경후 MOVE
   cd /usr/localsolr  디렉토리 이동

   bin/solr start

   vrcode(DB) core 생성
   bin/solr create –c vrcode

    http://IP:8983/solr 를 브라우져에서 실행하여 solr manager 화면이 나왔다면 성공!
   MySQL 연동을 위한 라이브러리 다운로드
   mysql-connector-java-5.1.39.jar
   형태소 분석을 위한 라이브러리 다운로드
   arirang.lucene-analyzer-6.1-1.0.0.jar
   arirang-morph-1.0.3.jar

*** 중요 ****
   /usr/local/solr/server/lib 디렉토리에 아래 받은 라이브러리 COPY
- mysql-connector-java-5.1.39.jar
- arirang.lucene-analyzer-6.1-1.0.0.jar
- arirang-morph-1.0.3.jar

해당 jar 파일은 /usr/local/solr/server/solr-webapp/webapp/WEB-INF/lib 에 꼭 넣어야함 안그러면 http://localhost:8983 웹 상에서 라이브러리 에러남

##########

/usr/local/solr/server/solr/vrcode/conf 폴더로 이동

 solrconfig.xml 파일을 열어서 아래와 같은 위치를 찾는다

before) 

<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/contrib/clustering/lib/" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-clustering-\d.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/contrib/langid/lib/" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-langid-\d.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/contrib/velocity/lib" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-velocity-\d.*\.jar" />

수정 -> after)

<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/contrib/clustering/lib/" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-clustering-\d.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/contrib/langid/lib/" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-langid-\d.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/contrib/velocity/lib" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-velocity-\d.*\.jar" />

  <lib dir="${solr.install.dir:../../../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />
  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-\d.*\.jar" />

  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">
                <str name="config">mapps-app-jdbc.xml</str>
        </lst>
  </requestHandler>

-   빨간 부분 추가
-   dataimport 관련하여 라이브러리를 추가시키는 작업입니다.
-   Import 관련 config는 mapps-app-jdbc.xml 파일을 사용합니다.
-   위 작업은 DATA를 넣을수 있게 해주는 dataimporthandler 라이브러리를 설정하는 작업입니다.


13)    mapps-app-jdbc.xml 파일을 생성후 아래와 같이 수정
-    접속정보, 쿼리 , 사용할 필드 정의가 들어가게됩니다.
<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db:3306/pplus?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8"  user="root" password="DBPASS" batchSize="-1" />
    <document>
        <entity  pk="seq" name="page" query="
Query // 외부 노출 이슈로 삭제
">
                        <field column="seq" name="id"   />
                        <field column="page_seq_no" name="page_seq_no"   />
.....
// 컬럼 정의 부분 외부 노출 이슈로 삭제


                </entity>
    </document>
</dataConfig>
-    dataSource는 JDBC연결 관련한 설정
-    entity는 import에 사용될 쿼리가 들어가게 됩니다.
-    Field 는 entitity에서 사용된 쿼리의 필드를 솔라에서 사용하게 정의를 해줍니다.
-    즉 쿼리할필드가 추가가 되면, 쿼리문에 필드추가후 field에도 똑같이 매핑하는 작업을 하셔야합니다.

**** query=" 빨간 부분부터 개발자가 짜준 쿼리를 입력
추가적으로 deltaimport 나 deltaqueryimport 를 추가할땐 query=가 끝나고 다음줄에 추가 해주면 됨

예)

        <entity  pk="seq" name="page" query="
Query // 외부 노출 이슈로 삭제
deltaImportQuery="
 // 외부 노출 이슈로 삭제
deltaQuery="
 // 외부 노출 이슈로 삭제
">

참고로 deltaimport 란 ? 변경된 DB의 정보만 가져와서 업데이트 하는 작업

이런식으로 추가 해주면 됨 


manage-schema 에  text_ko와 text_ko_auto일 경우 한글 형태소 분석기를 사용하도록 정의
<fieldType name="text_ko" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
         <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->
         <tokenizer class="solr.kr.KoreanTokenizerFactory"  hasOrigin="true" hasCNoun="false" bigrammable="true" />
         <filter class="solr.kr.KoreanFilterFactory"/>
         <!-- in this example, we will only use synonyms at query time
         <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
         -->
         <!-- Case insensitive stop word removal.
           add enablePositionIncrements=true in both the index and query
           analyzers to leave a 'gap' for more accurate phrase queries.
         -->
         <filter class="solr.StopFilterFactory"
                 ignoreCase="true"
                 words="stopwords.txt"
                 enablePositionIncrements="true"
                 />
         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
         <filter class="solr.LowerCaseFilterFactory"/>
         <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
       </analyzer>
       <analyzer type="query">
         <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->
         <tokenizer class="solr.kr.KoreanTokenizerFactory"/>
         <filter class="solr.kr.KoreanFilterFactory" hasOrigin="true" hasCNoun="false" bigrammable="true" />
         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
         <filter class="solr.StopFilterFactory"
                 ignoreCase="true"
                 words="stopwords.txt"
                 enablePositionIncrements="true"
                 />
         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
         <filter class="solr.LowerCaseFilterFactory"/>
         <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
       </analyzer>
     </fieldType>

    <fieldType name="text_ko_auto" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
         <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->
         <tokenizer class="solr.kr.KoreanTokenizerFactory"/>
         <filter class="solr.kr.KoreanFilterFactory"/>
         <!-- in this example, we will only use synonyms at query time
         <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
         -->
         <!-- Case insensitive stop word removal.
           add enablePositionIncrements=true in both the index and query
           analyzers to leave a 'gap' for more accurate phrase queries.
         -->
         <filter class="solr.StopFilterFactory"
                 ignoreCase="true"
                 words="stopwords.txt"
                 enablePositionIncrements="true"
                 />
         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
         <filter class="solr.LowerCaseFilterFactory"/>
         <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
       </analyzer>
       <analyzer type="query">
         <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->
         <tokenizer class="solr.kr.KoreanTokenizerFactory"/>
         <filter class="solr.kr.KoreanFilterFactory"/>
         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
         <filter class="solr.StopFilterFactory"
                 ignoreCase="true"
                 words="stopwords.txt"
                 enablePositionIncrements="true"
                 />
         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
         <filter class="solr.LowerCaseFilterFactory"/>
         <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
       </analyzer>
     </fieldType>
    <fieldType name="uuid" class="solr.UUIDField" indexed="true" />
 </types>


15)    필드타입정의하는 부분을 찾아 text_ko 추가
<fieldType name="text_ko" class="solr.TextField">
    <analyzer type="index">
      <tokenizer class="org.apache.lucene.analysis.ko.KoreanTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.ClassicFilterFactory"/>
      <filter class="org.apache.lucene.analysis.ko.KoreanFilterFactory" hasOrigin="true" hasCNoun="true" bigrammable="false"/>
      <filter class="org.apache.lucene.analysis.ko.HanjaMappingFilterFactory"/>
      <filter class="org.apache.lucene.analysis.ko.PunctuationDelimitFilterFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="org.apache.lucene.analysis.ko.KoreanTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.ClassicFilterFactory"/>
      <filter class="org.apache.lucene.analysis.ko.KoreanFilterFactory" hasOrigin="true" hasCNoun="true" bigrammable="false"/>
      <filter class="org.apache.lucene.analysis.ko.WordSegmentFilterFactory" hasOrijin="true"/>
      <filter class="org.apache.lucene.analysis.ko.HanjaMappingFilterFactory"/>
      <filter class="org.apache.lucene.analysis.ko.PunctuationDelimitFilterFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
    </analyzer>
      </fieldType>
-    /usr/local/solr/server/solr/vrcode/conf/managed-schema 파일에서 317라인참조
-    SOLR가 한글처리에 빈약하므로, 상위부분을 추가시킨 부분입니다.

16)    인덱싱 및 저장될 데이터 여부를 결정
- <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 를 찾아 아래에 추가
- 현재부분은 13)번의 mapps-app-jdbc.xml에서의 정의한 내용대로 필드정의를 해주면됩니다.
- indexed 가 true이면 검색조건에 포함하겠다는것이고, stroed는 데이터를 저장하고 가지고 있게냐에 대한 내용입니다.
- type은 전체적으로 text_ko라고 정의를 했는데 크게 지장은 없어서 맞추었고 , fancount만 float으로 정의를 했는데 혹시모를 integer범위를 넘어서는 경우가 있지않을까 해서 정의를 한것입니다.
- multivalued 가 true가 아닌것들이 있는데 소팅조건에 포함되는 내용은 multiValued를 사용하지 말아야합니다 (default는 false 입니다)
- /usr/local/solr/server/solr/vrcode/conf/manage-schema 파일의  428라인참조

<field name="nickname" type="text_ko" multiValued="true" indexed="true" stored="true"/>
  ...... // 컬럼 정의 부분 외부 노출 이슈로 삭제





17)    검색했을 경우 출력될 필드 정의
-    16)번과 마찬가지로 13)의 쿼리필드에 포함된 내용을 아래와 같이 정의를 해주면됩니다.
-    /usr/local/solr/server/solr/vrcode/conf/manage-schema 파일의 526라인참조
<copyField source="id" dest="text"/>
   ...... // 컬럼 정의 부분 외부 노출 이슈로 삭제

참고로 copyField 는 multiValued="true" 로 되어있는 필드만 정의 해주면 됨. (검색시 예를들면 제목+내용+지은이 이런식의 검색이 들어갈경우 '제목' '내용' '지은이' 의 컬럼을 multiValued="true" 로 해주고 <copyField source="제목" dest="제목+내용+지은이"/> 와 같이 필드를 복사해서 이용하면 됨)


마무리 ) 

/usr/local/solr/bin/solr.in.sh

해당 스크립트에 

#SOLR_JAVA_MEM="-Xms512m -Xmx512m" 해당 줄이 솔라에 할당하는 메모리 설정 구간

SOLR_JAVA_MEM="-Xms10g -Xmx15g"

위와 같이 설정하려면 SOLR_HEAP="512m" 이설정에 주석처리 후 적용











18)    UI상에서 데이터 IMPORT
http://IP:8983/solr/#/vrcode/dataimport//dataimport

19)    쿼리테스트 해볼수있는 URL
    http://IP:8983/solr/#/vrcode/query

20)    인덱싱 커멘드
    데이터 베이스 풀 인덱싱
 http://IP:8983/solr/vrcode/dataimport?command=full-import
    데이터 증분 인덱싱
http://IP:8983/solr/ vrcode /dataimport?command=delta-import

21)    형태소 분석기 및 검색관련 카페
http://cafe.naver.com/korlucene.cafe



반응형

'엔지니어 > Linux' 카테고리의 다른 글

ISCSI 설정하기  (0) 2016.11.18
Creating LUNs using LVM in iSCSI Target Server  (0) 2016.11.18
/var/log/messages 에 명령어 history 넣기  (0) 2016.11.18
centos 6 python3 설치  (0) 2016.11.18
iptables-FORWARD chain 작동안할때  (0) 2016.11.18