반응형
플러그인 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
https://www.elastic.co/kr/downloads/kibana
- 다운로드한 엘라스틱서치에 플러그인을 실행하도록 합니다.
다운 받은 엘라스틱서치 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"
}
로컬에서 플러그인을 추가해서 실행해 보았고 플러그인과 액션 핸들러가 잘 등록되었는지 확인해 보았습니다.
반응형
'ELK' 카테고리의 다른 글
Elasticsearch CircuitBreaker GC 관련 (2) | 2023.10.26 |
---|---|
Elasticsearch Essential 트러블 슈팅 사례 (0) | 2023.10.26 |
Elasticsearch 커스텀 분석기 만들기 (이슈) (0) | 2023.09.20 |
Elasticsearch 커스텀 분석기 만들기 (0) | 2023.09.19 |
ICU플러그인과 Suggest쿼리를 사용해 제안 검색어 만들기 (0) | 2023.09.18 |