Omeka의 Solr 검색엔진에 "아리랑" 한글 형태소 분석기 설치하는 방법

August 10 편집 OMEKA

오메카에서 Solr 검색 엔진을 사용하여 검색 기능을 제공하는 경우 한글 키워드로 검색을 하게 되면 검색 결과가 부정확하거나 적합하지 않은 결과가 나오는 경우가 많습니다. 이는 Solr 검색엔진이 영어권 국가를 기준으로 만들어진 관계로 한국어 검색을 위한 형태소 분석기가 별도로 설치되어 있지 않아서 발생하는 문제인데 검색 품질을 높이고자 한다면 기존 설치된 Solr에 한글 형태소 분석기를 설치하면 됩니다.
Solr에 아리랑 형태소 분석기를 설치하는 방법은 다음과 같습니다.
단 아래의 방법은 이미 Solr를 설치한 기준으로 설명드리는 것이므로 아직 Solr를 설치하지 않은 경우엔 아래 링크를 참고해서 설치한 후 1번 부터 순서대로 진행하면 됩니다.

# Omeka용 Solr 검색엔진 설치 및 셋팅하기(우분투 16 버젼 및 Omeka 2.5 버젼 기준 최신 Solr 검색엔진 설치)
http://osasf.net/discussion/579/omeka%EC%9A%A9-solr-%EA%B2%80%EC%83%89%EC%97%94%EC%A7%84-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%85%8B%ED%8C%85%ED%95%98%EA%B8%B0-%EC%9A%B0%EB%B6%84%ED%88%AC-16-%EB%B2%84%EC%A0%BC-%EB%B0%8F-omeka-2-5-%EB%B2%84%EC%A0%BC-%EA%B8%B0%EC%A4%80-%EC%B5%9C%EC%8B%A0-solr-%EA%B2%80%EC%83%89%EC%97%94%EC%A7%84-%EC%84%A4%EC%B9%98#latest


# Solr용 아리랑 형태소 분석기 설치 방법
1. 오메카 관리자모드 플러그인에서 Solr Search 플러그인 비활성화


2. Solr 서비스 중지
Solr 디렉토리로 이동. 만약 설치된 버젼이 6.3.0인 경우 아래의 경로 수정
$ cd /usr/local/solr-6.4.0

Solr 프로세스 모두 정지
$ ./bin/solr stop -force
$ ./bin/solr stop -c -z "localhost:2181,localhost:2182,localhost:2183/solr" -p 8983

다음의 명령어로 Solr 실행 상태 확인
$ ./bin/solr status
"No Solr nodes are running" 메시지가 나오면 정상적으로 정지된 것임.


3. 아리랑 한글 형태소 분석기 다운로드
- arirang-morph-1.1.0.jar 다운로드
http://osasf.net/uploads/sw/arirang.lucene-analyzer-6.2-1.1.0.jar

- arirang.lucene-analyzer-6.2-1.1.0.jar 다운로드
http://osasf.net/uploads/sw/arirang-morph-1.1.0.jar

- 한글 불용어 다운로드
http://osasf.net/uploads/sw/stopwords_ko.txt


4. Solr의 아래 경로에 1번의 형태소 분석기 업로드
/usr/local/solr-6.4.0/server/solr-webapp/webapp/WEB-INF/lib/


5. Solr의 아래 경로에 1번의 한글 불용어 업로드
/usr/local/solr-6.4.0/server/solr/omeka/conf/lang/


6. Solr의 스키마 xml 파일 수정
schema.xml 파일 열기
$ sudo nano /usr/local/solr-6.4.0/server/solr/omeka/conf/schema.xml

schema.xml에서 아래의 필드 설정 찾기

 <fields>

    <field name="id" type="string" indexed="true" stored="true" required="true" />
    <field name="title" type="text_en" indexed="true" stored="true" multiValued="true" />
    <field name="tag" type="string" indexed="true" stored="true" multiValued="true" />
    <field name="collection" type="string" indexed="true" stored="true" />
    <field name="public" type="boolean" indexed="true" stored="true" />
    <field name="featured" type="boolean" indexed="true" stored="true" />
    <field name="itemtype" type="string" indexed="true" stored="true" />
    <field name="resulttype" type="string" indexed="true" stored="true" />
    <field name="model" type="string" indexed="false" stored="true" />
    <field name="modelid" type="string" indexed="false" stored="true" />
    <field name="text" type="text_en" indexed="true" stored="false" multiValued="true"/>
    <field name="_version_" type="long" indexed="true" stored="true"/>

    <dynamicField name="*_t" type="text_en" indexed="true" stored="true" multiValued="true" />
    <dynamicField name="*_s" type="string" indexed="true" stored="true" multiValued="true" />

  </fields>

위의 필드 설정 값 중 필드명이 title, text, *_t 인 필드명의 타입값을 다음과 같이 수정
타입값이 text_en인 것만 text_ko로 변경

 <fields>

    <field name="id" type="string" indexed="true" stored="true" required="true" />
    <field name="title" type="text_ko" indexed="true" stored="true" multiValued="true" />
    <field name="tag" type="string" indexed="true" stored="true" multiValued="true" />
    <field name="collection" type="string" indexed="true" stored="true" />
    <field name="public" type="boolean" indexed="true" stored="true" />
    <field name="featured" type="boolean" indexed="true" stored="true" />
    <field name="itemtype" type="string" indexed="true" stored="true" />
    <field name="resulttype" type="string" indexed="true" stored="true" />
    <field name="model" type="string" indexed="false" stored="true" />
    <field name="modelid" type="string" indexed="false" stored="true" />
    <field name="text" type="text_ko" indexed="true" stored="false" multiValued="true"/>
    <field name="_version_" type="long" indexed="true" stored="true"/>

    <dynamicField name="*_t" type="text_ko" indexed="true" stored="true" multiValued="true" />
    <dynamicField name="*_s" type="string" indexed="true" stored="true" multiValued="true" />

  </fields>


다음의 필드 타입 설정을 모두 복사한 후 schema.xml의 fieldType 위치에 붙여 넣기
여러 나라들의 fieldType이 있는데 그 위에나 아래쪽에 붙여 넣으면 됩니다.

<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" queryMode="false" hasOrigin="true" hasCNoun="true" bigrammable="false"/>
   <filter class="org.apache.lucene.analysis.ko.HanjaMappingFilterFactory"/>
   <filter class="org.apache.lucene.analysis.ko.PunctuationDelimitFilterFactory" hasConcatedTerm="false"/>
   <filter class="solr.StopFilterFactory" words="lang/stopwords_ko.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" queryMode="true" hasOrigin="false" hasCNoun="true" bigrammable="false"/>
   <filter class="org.apache.lucene.analysis.ko.HanjaMappingFilterFactory"/>
   <filter class="org.apache.lucene.analysis.ko.PunctuationDelimitFilterFactory" hasConcatedTerm="false"/>
  <filter class="solr.StopFilterFactory" words="lang/stopwords_ko.txt" ignoreCase="true"/>
 </analyzer>
</fieldType> 


7. Solr 서비스 시작 
Solr 디렉토리로 이동.
$ cd /usr/local/solr-6.4.0

만약 설치되어 있는 Solr의 버젼이 6.3.0이나 다른 버젼인 경우 경로명 입력 주의.
버젼이 6.3.0인 경우는 아래와 같이 입력.
$ cd /usr/local/solr-6.3.0

Solr 서비스 시작
$ ./bin/solr start -force


8. 오메카의 레코드 재색인
관리자모드  Settings > Search 페이지에서 Index Records 버튼 클릭.
레코드가 몇 만 건 이상인 경우는 정상적인 프로세스를 위해 최소 20~30분 정도 관리 작업 중지.


9. 오메카의 Solr Search 플러그인 활성화


10. Solr Search에서 Solr를 위한 레코드 재색인
관리자모드 좌측 메뉴 중 Solr Search 클릭 > Index 탭에서 Clear and Reindex 버튼 클릭.


11. Solr 검색 페이지에서 한글 키워드 검색 테스트


12. 끝.




참고로 한글형태소분석기를 설치한 버젼의 오메카와 설치하지 않은 버젼의 오메카의 키워드 검색을 비교 검토한 결과 형태소분석기가 설치된 버젼의 검색 품질이 좀더 높아졌음을 확인할 수 있었습니다.
아래의 예시는 아리랑 형태소분석기 설치 전과 후의 검색 결과를 비교한 것입니다.


# 형태소분석기 설치 전 검색 결과

  - 검색에 사용한 키워드 : 중대
  - 검색 결과 : 0건 검색 

  image
  - 검색에 사용한 키워드 : 신문사
  - 검색 결과 : 0건 검색 
image
  - 검색에 사용한 키워드 : 지금
  - 검색 결과 : 0건 검색
image

# 형태소분석기 설치 후 검색 결과
  - 검색에 사용한 키워드 : 중대
  - 검색 결과 : '중대'로 시작하는 '중대신문사'가 검색됨. 
                       와일드카드문자(*)를 사용하지 않아도 검색 시 전방일치(Right Truncation)가 된다는 것을 알 수 있음.                 
                       ex)   기록관리*   =>   검색결과:  기록관리, 기록관리공개소프트웨어포럼
image

  - 검색에 사용한 키워드 : 신문사
  - 검색 결과 : '신문사'로 끝나는 '중대신문사'가 검색됨. 
                       와일드카드문자(*)를 사용하지 않아도 검색 시 후방일치(Left Truncation)가 된다는 것을 알 수 있음
                       ex)   *보고서   =>   검색결과:  보고서,  상황보고서
image


  - 검색에 사용한 키워드 : 지금
  - 검색 결과 : "지금" 검색시 "지금도"에서 조사인 "도"는 불용어로 인식.
image




# Arirang 형태소분석기(구 명칭 : Lucene Korean Analyzer)의 구조

1) arirang morph
   - 형태소 분석을 담당하는 JAVA 클래스들이 들어 있음.
     JAVA 클래스가 들어 있는 이유는 Solr나 ElasticSearch 같은 아파치 루썬(Lucene) 기반의 검색엔진이 자바 언어로 만들어져 있기 때문.
   - 클래스 중 MorphAnalyzer는 형태소 분석에 사용되는 핵심 클래스.
   - dic 디렉토리에는 한글 사전 데이터가 들어 있음(기본사전: total.dic, 조사사전: josa.dic, 어미사전: eomi.dic, 접두어사전: prefix.dic 등) 

image

image
2) arirang analyzer
   - KoreanTokenizer 클래스는 한글과 영문을 Token 단위로 분리.

image



Solr엔진에한글형태소분석기설치전-키워드-중대-검색시.jpg
353 x 156 - 9K
Solr엔진에한글형태소분석기설치전-키워드-신문사-검색시.jpg
355 x 160 - 11K
후방일치.jpg
442 x 231 - 28K
지금 검색시 결과.jpg
456 x 209 - 29K
arirang-morph.jpg
678 x 389 - 166K
arirang-morph 사전.jpg
681 x 368 - 121K
arirang.lucene-analyzer.jpg
770 x 435 - 199K
Solr엔진에한글형태소분석기설치후결과화면-키워드-중대-검색시.jpg
470 x 221 - 28K
3-1.jpg
466 x 158 - 11K
3-2.jpg
456 x 209 - 29K

코멘트

  • 위의 내용은 8월 10일자로 다시 수정했습니다.
    필드 타입 관련 설정이 빠져 있어서 내용 보강했고 기타 설명을 좀 더 추가했습니다.
    설치시 참고하시기 바랍니다.

코멘트에 접속 혹은 등록.