'루씬한국어형태소분석기'에 해당되는 글 1건

  1. 2013.04.19 [Elasticsearch] Plugins - site 플러그인과 custom analyzer 플러그인 만들기 1

[Elasticsearch] Plugins - site 플러그인과 custom analyzer 플러그인 만들기

Elastic/Elasticsearch 2013. 4. 19. 10:55

본 문서는 개인적인 테스트와 elasticsearch.org 그리고 community 등을 참고해서 작성된 것이며,

정보 교환이 목적입니다.


잘못된 부분에 대해서는 지적 부탁 드립니다.

(예시 코드는 성능 및 보안 검증이 되지 않았습니다.)



[elasticsearch API 리뷰]

원문 링크 : http://www.elasticsearch.org/guide/reference/modules/plugins/


elasticsearch를 사용하면서 가장 많이 사용하는 것이 head 와 kr lucene 형태소 분석기가 아닌가 싶습니다.

그럼 이런 것들은 어떻게 제작을 해야 하는지 궁금 할텐데요.

위 원문 아래쪽에 제공되는 모든 plugin 목록을 보여 주고 있습니다.

또는 아래 링크에서도 확인이 가능 합니다.


[git]

- https://github.com/elasticsearch

- https://github.com/search?q=elasticsearch&type=&ref=simplesearch


우선 head와 같은 site plugin 구성 부터 살펴 보겠습니다.

이건 사실 설명이 필요 없습니다. ^^;;


[_site plugin]

- plugin location : ES_HOME/plugins

- site plugin name : helloworld

- helloworld site plugin location : ES_HOME/plugins/helloworld

    . helloworld 폴더 아래로 _site 폴더 생성

    . _site 폴더 아래로 구현한 html, js, css 등의 파일을 위치 시키고 아래 링크로 확인 하면 됩니다.

- helloworld site plugin url

    . http://localhost:9200/_plugin/helloworld/index.html

- elasticsearch server 와의 통신은 ajax 통신을 이용해서 필요한 기능들을 구현 하시면 됩니다.


[kr lucene analyzer plugin] 

- 이미 관련 plugin 은 제공 되고 있습니다.

- 아래 링크 참고

http://cafe.naver.com/korlucene

https://github.com/chanil1218/elasticsearch-analysis-korean

- 적용하는 방법은 두 가지 입니다.

    . First : elasticsearch-analysis-korean 을 설치 한다. (설치 시 es 버전을 맞춰 주기 위해서 별도 빌드가 필요 할 수도 있다.)

    . Second : lucene kr analyzer 라이브러리를 이용해서 plugin 형태로 제작해서 설치 한다.

- 아래는 plugin  형태로 제작해서 설치한 방법을 기술 한 것입니다.

분석기 라이브러리를 사용하는 경우 kimchy 가 만들어 놓은 코드를 기본 템플릿으로 사용해서 구현 하시면 쉽고 빠르게 적용 하실 수 있습니다.

https://github.com/elasticsearch/elasticsearch-analysis-smartcn


- 만들어 봅시다.

[프로젝트 구성]

- Eclipse 에서 Maven 프로젝트를 하나 생성 합니다.


[패키지 및 리소스 구성]

- org.elasticsearch.index.analysis

    . KrLuceneAnalysisBinderProcessor.java

public class KrLuceneAnalysisBinderProcessor extends AnalysisModule.AnalysisBinderProcessor {


    @Override

    public void processAnalyzers(AnalyzersBindings analyzersBindings) {

        analyzersBindings.processAnalyzer("krlucene_analyzer", KrLuceneAnalyzerProvider.class);

    }


    @Override

    public void processTokenizers(TokenizersBindings tokenizersBindings) {

        tokenizersBindings.processTokenizer("krlucene_tokenizer", KrLuceneTokenizerFactory.class);

    }


    @Override

    public void processTokenFilters(TokenFiltersBindings tokenFiltersBindings) {

        tokenFiltersBindings.processTokenFilter("krlucene_filter", KrLuceneTokenFilterFactory.class);

    }

}

    . 이 클래스는 analyzer, tokenizer, filter 를 name 기반으로 등록해 준다.

    . settings 구성 시 analyzer, tokenizer, filter 에 명시 하는 name 부분에 해당한다.

    . settings 에서 type 부분에는 패키지 full path 를 명시 하면 된다.

curl -XPUT http://localhost:9200/test  -d '{

    "settings" : { 

        "index": {

            "analysis": {

                "analyzer": {

                    "krlucene_analyzer": {

                        "type": "org.elasticsearch.index.analysis.KrLuceneAnalyzerProvider",

                        "tokenizer" : "krlucene_tokenizer",

                        "filter" : ["trim","lowercase", "krlucene_filter"]

                    }   

                }   

            }   

        }   

    }   

}'


    . KrLuceneAnalyzerProvider.java

public class KrLuceneAnalyzerProvider extends AbstractIndexAnalyzerProvider<KoreanAnalyzer> {


    private final KoreanAnalyzer analyzer;


    @Inject

    public KrLuceneAnalyzerProvider(Index index, @IndexSettings Settings indexSettings, Environment env, @Assisted String name, @Assisted Settings settings) throws IOException {

        super(index, indexSettings, name, settings);


        analyzer = new KoreanAnalyzer(Lucene.VERSION.LUCENE_36);

    }


    @Override

    public KoreanAnalyzer get() {

        return this.analyzer;

    }

}


    . KrLuceneTokenFilterFactory.java

public class KrLuceneTokenFilterFactory extends AbstractTokenFilterFactory {


    @Inject

    public KrLuceneTokenFilterFactory(Index index, @IndexSettings Settings indexSettings, @Assisted String name, @Assisted Settings settings) {

        super(index, indexSettings, name, settings);

    }


    @Override

    public TokenStream create(TokenStream tokenStream) {

        return new KoreanFilter(tokenStream);

    }

}


    . KrLuceneTokenizerFactory.java

public class KrLuceneTokenizerFactory extends AbstractTokenizerFactory {


    @Inject

    public KrLuceneTokenizerFactory(Index index, @IndexSettings Settings indexSettings, @Assisted String name, @Assisted Settings settings) {

        super(index, indexSettings, name, settings);

    }


    @Override

    public Tokenizer create(Reader reader) {

        return new KoreanTokenizer(Lucene.VERSION.LUCENE_36, reader);

    }

}


- org.elasticsearch.plugin.analysis.krlucene

    . AnalysisKrLucenePlugin.java

    . 이 클래스는 생성한 plugin 을 es 에 등록해 주는 역할을 한다.

    . plugin 명을 analysis-krlucene 라고 했을 경우 아래와 같은 path 에 jar 파일을 위치 시켜야 합니다.

    ES_HOME/plugins/analysis-krlucene


- src/main/assemblies/plugin.xml

<?xml version="1.0"?>

<assembly>

    <id>plugin</id>

    <formats>

        <format>zip</format>

    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>

    <dependencySets>

        <dependencySet>

            <outputDirectory>/</outputDirectory>

            <useProjectArtifact>true</useProjectArtifact>

            <useTransitiveFiltering>true</useTransitiveFiltering>

            <excludes>

                <exclude>org.elasticsearch:elasticsearch</exclude>

            </excludes>

        </dependencySet>

        <dependencySet>

            <outputDirectory>/</outputDirectory>

            <useProjectArtifact>true</useProjectArtifact>

            <scope>provided</scope>

        </dependencySet>

    </dependencySets>

</assembly>


- src/main/resources/es-plugin.properties

plugin=org.elasticsearch.plugin.analysis.krlucene.AnalysisKrLucenePlugin


- 이렇게 해서 빌드를 하시고 생성된 jar 파일을 위에서 언급한 경로에 위치 시키고 ES 재시작 후 아래와 같이 테스트 해보시면 됩니다.


[테스트]

- test 인덱스 생성 (위에 생성 코드 참고)

- 테스트 URL

    . http://localhost:9200/test/_analyze?analyzer=krlucene_analyzer&text=이것은 루씬한국어 형태소 분석기 플러그인 입니다.&pretty=1

{
  "tokens" : [ {
    "token" : "이것은",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "이것",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "루씬한국어",
    "start_offset" : 4,
    "end_offset" : 9,
    "type" : "word",
    "position" : 3
  }, {
    "token" : "루씬",
    "start_offset" : 4,
    "end_offset" : 6,
    "type" : "word",
    "position" : 4
  }, {
    "token" : "한국어",
    "start_offset" : 6,
    "end_offset" : 9,
    "type" : "word",
    "position" : 5
  }, {
    "token" : "형태소",
    "start_offset" : 10,
    "end_offset" : 13,
    "type" : "word",
    "position" : 6
  }, {
    "token" : "분석기",
    "start_offset" : 14,
    "end_offset" : 17,
    "type" : "word",
    "position" : 7
  }, {
    "token" : "분석",
    "start_offset" : 14,
    "end_offset" : 16,
    "type" : "word",
    "position" : 8
  }, {
    "token" : "플러그인",
    "start_offset" : 18,
    "end_offset" : 22,
    "type" : "word",
    "position" : 9
  }, {
    "token" : "플러그",
    "start_offset" : 18,
    "end_offset" : 21,
    "type" : "word",
    "position" : 10
  }, {
    "token" : "입니다",
    "start_offset" : 23,
    "end_offset" : 26,
    "type" : "word",
    "position" : 11
  }, {
    "token" : "입니",
    "start_offset" : 23,
    "end_offset" : 25,
    "type" : "word",
    "position" : 12
  } ] 

}


※ lucene 버전을 3.x 에서 4.x 로 올리고 싶으시다면 직접 코드 수정을 통해서 진행을 하시면 됩니다.

- elasticsearch-analysis-korean 의 경우는 고쳐야 할 부분이 좀 됩니다.

    . 우선 루씬 한국어 형태소 소스코드를 3.x 에서 4.x 로 올리셔야 합니다.

    . 관련 코드는 루씬 한국어 형태소 분석기 카페에 들어가 보시면 cvs 링크가 있습니다.

:pserver:anonymous@lucenekorean.cvs.sourceforge.net:/cvsroot/lucenekorean

    . 추가로 es 버전도 올리고 싶으시다면 pom.xml 에서 코드를 수정해 주시기 바랍니다.

<properties>

    <elasticsearch.version>0.20.4</elasticsearch.version>

    <lucene.version>3.6.2</lucene.version>

</properties>


- 직접 플러그인을 생성해서 적용하는 방법은 위와 같이 플러그인을 만드시고 루씬한국어 형태소 분석기 라이브러리만 버전에 맞게 넣어서 사용하시면 됩니다.

    . 단, 플러그인의 pom.xml 에서 각 라이브러리의 version 은 맞춰 주셔야 겠죠.


: