아빠는 개발자

[plugin] analysis plugin 을 만들어보자 본문

Elastic/plugin

[plugin] analysis plugin 을 만들어보자

father6019 2024. 1. 15. 23:00
728x90
반응형

Project path

  • local: /Users/doo/plugin/aqqle_analyzer
  • git: https://github.com/900gle/aqqle_analyzer

라이선스 이슈때문에 테스트도 못해보고 망한 작업 


 

우선 아래에 링크에 있는 내용을 확인한다. 

https://www.elastic.co/guide/en/elasticsearch/plugins/current/example-text-analysis-plugin.html

 

작업 요약

  • github.com (https://github.com/elastic/elasticsearch.git) 에서 elasticsearch 소스 다운로드
  • 소스에서 plugin > example >  stable-analysis  복사
  • build.gradle 수정 및 plugin 빌드
  • elasticsearch 에 빌드한 플러그인 설치 - docker compose 
  • 테스트

문제는 어떤기능을 플러그인으로 만들어야 할지 모른다는 것..

 

900gle 에서 사용하던 필터 모듬을 aqqle 용으로 gradle로 컨버팅해보자 

디펜던시 추가하고 소스 똑같이 복사했는데 ES 를 구동할때 plugin 을 받아오고  jar hell 에러가 난다. 검색도 해보고 삽질도 해봤는데 도저히 답이 안나와서 소스 하나씩 다 지워 가면서 원인 파악

 

아래 두개를 불러와야 하는데 디펜던시 하는 부분에서 버그 원인 발견

// https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch
compileOnly 'org.elasticsearch:elasticsearch:8.8.1'
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
compileOnly 'org.apache.commons:commons-lang3:3.14.0'

 

 

compileOnlyimplementation의 문제 였음.

  • compileOnly는 컴파일 타임에만 필요한 의존성을 정의하는 데 사용한다.
  • implementation은 컴파일 타임과 런타임에 모두 사용한다.

 

참고 자료

- implementation: 의존 라이브러리 수정 시 본 모듈까지만 재빌드

  • 컴파일 타임에 필요하고 런타임에도 필요할 경우 사용한다.
  • 그러므로 implementation 키워드로 정의한 의존성은 JAR 파일에 포함된다.

- api: 의존 라이브러리 수정 시 본 모듈을 의존하는 모듈들도 재빌드

- compileOnly: compile 시에만 빌드하고 빌드 결과물에는 포함하지 않음

  • 컴파일 타임에만 필요하고 런타임에는 필요하지 않을 때 사용한다.
  • 그러므로 compileOnly 키워드로 정의한 의존성은 JAR 파일에 포함되지 않는다.

- runtime 시 필요 없는 라이브러리인 경우 (runtime 환경에 이미 라이브러리가 제공되고 있는가 하는 등의 경우)

 

아무튼 일단 설치를 완료하고 plugin 을 테스트 해보려고 하는데 plugin 을 찾지 못하는 이슈 발생

 

플러스인 빌드

gradle bundlePlugin

 

실행하면 

/aqqle_analyzer/build/distributions 에 zip 파일 생성됨

 

 

이걸 elasticsearch 디렉토리에 복사 

 

컨테이너 실행  

docker compose -f docker-compose-es-kibana.yml up -d --build

 

기존소스(maven project) ES v7  는 이런식으로 map 형태의 provider 를 반환했는데  

public class DooPlugin extends Plugin implements AnalysisPlugin {

    @Override
    public Map<String, AnalysisModule.AnalysisProvider<TokenFilterFactory>> getTokenFilters() {

        Map<String, AnalysisModule.AnalysisProvider<TokenFilterFactory>> extra = new HashMap<>();
//         (1) 한글 자모 분석 필터
        extra.put("doo-jamo", JamoTokenFilterFactory::new);
        return extra;
    }
}

 

 

FilterFactory

/*
 * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
 * or more contributor license agreements. Licensed under the Elastic License
 * 2.0 and the Server Side Public License, v 1; you may not use this file except
 * in compliance with, at your election, the Elastic License 2.0 or the Server
 * Side Public License, v 1.
 */

package com.doo.aqqle_analyzer.analysis;

import com.doo.aqqle_analyzer.lucene.JamoTokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.elasticsearch.plugin.Inject;
import org.elasticsearch.plugin.NamedComponent;
import org.elasticsearch.plugin.analysis.AnalysisMode;
import org.elasticsearch.plugin.analysis.TokenFilterFactory;

@NamedComponent( "jamo")
public class JamoFilterFactory implements TokenFilterFactory {
    private final long tokenFilterNumber;

    @Inject
    public JamoFilterFactory(ExampleAnalysisSettings settings) {
        this.tokenFilterNumber = settings.digitToSkipInTokenFilter();
    }

    @Override
    public TokenStream create(TokenStream tokenStream) {
        return new JamoTokenFilter(tokenStream, tokenFilterNumber);
    }

    @Override
    public TokenStream normalize(TokenStream tokenStream) {
        return new JamoTokenFilter(tokenStream, tokenFilterNumber);
    }

    @Override
    public AnalysisMode getAnalysisMode() {
        return TokenFilterFactory.super.getAnalysisMode();
    }

}

 

 

토큰필터 모듬을 적용했더니 license 문제가 발생하네;; 제거 하면 정상동작함 이건 테스트도 못해보고 애매하게 끝날 듯..

라이센스를 어떻게 회피할지  찾아봐야겠음..

 

GET plugin_test/_analyze
{
  "text": "플러그인 테스트",
  "tokenizer": "whitespace",
  "filter": [
    "chosung"
  ]
}

 

이걸 날리면 

 

{
  "statusCode": 503,
  "error": "Service Unavailable",
  "message": "License is not available."
}

728x90
반응형