일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- JPA
- dbeaver
- api cache
- java crawler
- Elasticsearch
- ann
- NORI
- KNN
- 양자컴퓨터
- Analyzer
- Selenium
- 아이온큐
- 테슬라
- Docker
- Query
- Cache
- elasticsearch cache
- Elastic
- java
- mysql
- TSLA
- request cache
- IONQ
- redis
- Aggregation
- aqqle
- aggs
- API
- vavr
- file download
- Today
- Total
아빠는 개발자
[plugin] analysis plugin 을 만들어보자 본문
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'
compileOnly와 implementation의 문제 였음.
- 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."
}