본문 바로가기

엔지니어/Linux

SOLR 5.5.2 단독형 설치 (with jdbc, arirang.lucene-analyzer)

728x90
반응형
SOLR 5.5.2 단독형 설치 (with jdbc, arirang.lucene-analyzer)

cd /usr/local/src
wget 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)

tar xvf solr-5.5.2.tgz
mv solr-5.5.2 /usr/local/solr
cd /usr/local/solr

bin/solr start

(DB) core 생성
bin/solr create_core –c CORE명(DB)

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://IP:8983 웹 상에서 라이브러리 에러남

##########

/usr/local/solr/server/solr/CORE명/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 파일을 사용
-   위 작업은 Mysql DATA를 넣을수 있게 해주는 dataimporthandler 라이브러리를 설정하는 작업


13)    mapps-app-jdbc.xml 파일을 생성후 아래와 같이 수정
-    접속정보, 쿼리 , 사용할 필드 정의가 들어가게 됨
<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://DB.IP:3306/DB명?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8"  user="USER" password="PASSWORD" batchSize="-1" />
    <document>
        <entity  pk="seq" name="page" query="
SELECT
.... 생략(쿼리 내용)
">
                        <field column="COLUMN 명" name="COLUMN을 정의한 NAME"   />
                </entity>
    </document>
</dataConfig>
-    dataSource는 JDBC연결 관련한 설정
-    entity는 import에 사용될 쿼리가 들어가게 됨
-    Field 는 entitity에서 사용된 쿼리의 필드를 솔라에서 사용하게 정의
-    즉 쿼리할필드가 추가가 되면, 쿼리문에 필드추가후 field에도 똑같이 매핑하는 작업

추가적으로 deltaimport 나 deltaqueryimport 를 추가할땐 query=가 끝나고 다음줄에 추가 해주면 됨

예)

        <entity  pk="seq" name="page" query="
SELECT
         ...... 생략(쿼리 내용)
deltaImportQuery="
SELECT
         ...... 생략(쿼리 내용)
deltaQuery="
SELECT
         ...... 생략(쿼리 내용)

참고로 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>

-    SOLR가 한글처리에 빈약하므로, 상위부분을 추가시킨 부분입니다.

16)    인덱싱 및 저장될 데이터 여부를 결정
- <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 이런식으로 13)번의 mapps-app-jdbc.xml에서의 정의한 내용과 같이 필드정의를 해주면 됨
- indexed 가 true이면 검색조건에 포함하겠다는 것이고, stored는 데이터를 저장에 대한 내용
- type은 자료형에 맞게끔 정의
- multiValued 란 문서에서 한 필드에 쓰일 값들이 두 개 이상일 수 있는 경우를 일컫습니다.


모든 설정이 되었으면

http://IP:8983/solr 로 접속하여 CORE 선택 후 Dataimport 에서 Execute 로 데이터를 넣고 완료가 되면  Query 로 테스트하여 정상적으로 동작하는지 체크

이상이 없다면 완료


Dataimport 가 정상적으로 되지 않을 경우 jvm 에 Heap Memory 설정이 너무 낮게 설정되어 오류가 나는 경우가 있음.

아래 설정도 체크

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

해당 스크립트에 

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

SOLR_JAVA_MEM="-Xms10g -Xmx15g"

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


반응형

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

ats 모듈 만들기  (0) 2017.01.13
Apache traffic server-5.2.1 install  (0) 2017.01.13
LVM(Logical Volume Manage)이란?  (0) 2017.01.10
본딩 해쉬 알고리즘 관련한 글  (0) 2017.01.10
Linux Perfoment Tools  (0) 2017.01.10