본문으로 바로가기

Elasticsearch 커스텀 분석기 만들기 (1)

category ELK 2023. 9. 25. 16:30
반응형


플러그인 TokenFilter, Tokenizer, Analyzer, RestHandler 등록 코드를 작성

 

TodoPlugin

  • Elasticsearch 플러그인을 개발하기 위해서 Plugin 클래스 상속받습니다.
  • AnalysisPlugins 인터페이스를 구현하면 Elasticsearch에서 사용 가능한 텍스트 분석 관련 요소를 등록할 수 있습니다.(TokenFilters, Tokenizers, Analyzers) 각 관련 기능 메서드를 재정의하여 호출하도록 변경이 필요합니다.
  • ActionPlugin 인터페이스를 구현하면 Elasticsearch에서 사용할 수 있는 Action을 등록할 수 있습니다.
public class TodoPlugin extends Plugin implements AnalysisPlugin, ActionPlugin {

    /**
     * 필터 등록
     */
    @Override
    public Map<String, AnalysisModule.AnalysisProvider<TokenFilterFactory>> getTokenFilters() {
        return AnalysisPlugin.super.getTokenFilters();
    }

    /**
     * 토크나이저 등록
     */
    @Override
    public Map<String, AnalysisModule.AnalysisProvider<TokenizerFactory>> getTokenizers() {
        return AnalysisPlugin.super.getTokenizers();
    }

    /**
     * 분석기 등록
     */
    @Override
    public Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<? extends Analyzer>>> getAnalyzers() {
        return AnalysisPlugin.super.getAnalyzers();
    }

    /**
     * action 등록
     */
    @Override
    public List<RestHandler> getRestHandlers(final Settings settings,
                                             final RestController restController,
                                             final ClusterSettings clusterSettings,
                                             final IndexScopedSettings indexScopedSettings,
                                             final SettingsFilter settingsFilter,
                                             final IndexNameExpressionResolver indexNameExpressionResolver,
                                             final Supplier<DiscoveryNodes> nodesInCluster) {
        return Collections.singletonList(new TodoPluginAction());
    }
}

 

TodoPluginAction

  • BaseRestHandler 클래스를 상속받아 Elasticsearch Rest 액션을 처리하는 커스텀 핸들러를 정의합니다.
  • routes 메서드를 사용하여 커스텀 액션 라우팅 정보를 정의합니다.
  • action 파라미터가 _nocode와 같을 경우 JSON으로 응답을 보냅니다.
public class TodoPluginAction extends BaseRestHandler {

    private static final String TEST_ACTION = "_nocode";
    private static final String BASE_URI = "_custom";

    @Override
    public List<Route> routes() {
        return Collections.unmodifiableList(Arrays.asList(
                new Route(GET, BASE_URI + "/{action}")));
    }

    @Override
    public String getName() {
        return "custom-analysis";
    }

    @Override
    protected RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
        final String action = request.param("action");

        XContentBuilder builder = JsonXContent.contentBuilder();

        if (TEST_ACTION.equals(action)) {
            builder.startObject();
            builder.field("description", "Elasticsearch-todo-plugin-custom response\n: " + new Date().toString());
            builder.endObject();
        }

        return channel -> channel.sendResponse(new BytesRestResponse(OK, builder));
    }
 }

 

 

테스트 환경 구축

 

  • 엘라스틱서치와 키바나를 다운로드합니다.

https://www.elastic.co/kr/downloads/elasticsearch

 

Download Elasticsearch

Download Elasticsearch or the complete Elastic Stack (formerly ELK stack) for free and start searching and analyzing in minutes with Elastic.

www.elastic.co

https://www.elastic.co/kr/downloads/kibana

 

Download Kibana Free | Get Started Now

Download Kibana or the complete Elastic Stack (formerly ELK stack) for free and start visualizing, analyzing, and exploring your data with Elastic in minutes.

www.elastic.co

 

  • 다운로드한 엘라스틱서치에 플러그인을 실행하도록 합니다.

다운 받은 엘라스틱서치 plugin 폴더에 properties 파일을 추가해 줍니다.

version=1.0

description=Elasticsearch Custom Plugin Example

name=elasticsearch-plugin-custom

classname=com.elasticsearch.plugin.TodoPlugin

java.version=11

elasticsearch.version=7.8.1

 

  • 다운로드한 엘라스틱서치의 JDK를 등록하고 VM option을 설정해 줍니다.
-Xms1g -Xmx1g
-Dlog4j2.disable.jmx=true 
-Des.path.home="경로/elasticsearch-7.8.1" 
-Des.path.conf="경로/elasticsearch-7.8.1/config"

 

정상 실행되면 엘라스틱서치의 플러그인이 잘 등록되었는지 확인합니다.

http://localhost:9200/_cat/plugins

node-1 elasticsearch-plugin-custom 1.0

등록한 핸들러 액션을 호출해 봅니다.

http://localhost:9200/_custom/_nocode

// 20230925162852
// http://localhost:9200/_custom/_nocode

{
  "description": "Elasticsearch-todo-plugin-custom response\n: Mon Sep 25 16:28:52 KST 2023"
}

 

로컬에서 플러그인을 추가해서 실행해 보았고 플러그인과 액션 핸들러가 잘 등록되었는지 확인해 보았습니다.

반응형