[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 은 맞춰 주셔야 겠죠.