elasticsearch 플러그 인 개발 강좌

검색엔진 Elasticsearch 는 플러그 인 모드 를 지원 합 니 다.어떤 때 는 플러그 인 을 설치 해 야 할 수도 있 습 니 다.심지어 스스로 플러그 인 을 개발 하면 여기 서 하나의 를 제공 합 니 다.ES 플러그 인 개발 데모 샘플,ES 버 전 번 호 는 1.5.2 입 니 다.
org.elasticsearch.plugins.AbstractPlugin 에서 플러그 인 클래스 계승

package org.elasticsearch.plugin.helloworld;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import org.elasticsearch.common.component.LifecycleComponent;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.plugins.AbstractPlugin;
import org.elasticsearch.rest.RestModule;

public class HelloWorldPlugin extends AbstractPlugin {
 final ESLogger logger = Loggers.getLogger(getClass());

 @Override
 public String name() {
 //    
 return "HelloWorld";
 }

 @Override
 public String description() {
 //      
 return "Hello World Plugin";
 }
 
 //    ,          Module,            
 @Override
 public void processModule(Module module) {
 if(module instanceof RestModule) {
  ((RestModule)module).addRestAction(HelloWorldHandler.class);
 }
 
 if(module instanceof HelloModule) {
  logger.info("############## process hello module #####################");
 }
 }
 
 @Override
 public Collection<Module> modules(Settings settings) {
 //         
 //          ,      
 HelloModule helloModule = new HelloModule();
 ArrayList<Module> list = new ArrayList<>();
 list.add(helloModule);
 Collections.unmodifiableList(list);
 return list;
 }
 
 @SuppressWarnings("rawtypes")
 @Override
 public Collection<Class<? extends LifecycleComponent>> services() {
 //          ,        LifecycleComponent。ES             ,    start  
 //           。      
 Collection<Class<?
 extends LifecycleComponent>> list = new ArrayList<>();
 list.add(HelloService.class);
 return list;
 }
 
}

모듈 류 는 사실상 의존 주입 규칙 을 정의 했다.잘 모 르 겠 으 면 Google Guice 문 서 를 볼 수 있 습 니 다.기본적으로 일치 합 니 다.예 를 들 어 Hello Module:

package org.elasticsearch.plugin.helloworld;

import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.common.inject.Scopes;

public class HelloModule extends AbstractModule {

 @Override
 protected void configure() {
 // InjectableService       InjectableServiceImpl   
 //     InjectableService   ,    InjectableServiceImpl  
 bind(InjectableService.class).to(InjectableServiceImpl.class);
 // HelloService     
 bind(HelloService.class).in(Scopes.SINGLETON);
 }
 
}

서로 다른 모듈 은 서로 다른 처리 방식 이 있 습 니 다.예 를 들 어 사례 에서 RestModule 에 Handler 를 추 가 했 습 니 다.

package org.elasticsearch.plugin.helloworld;

import org.elasticsearch.client.Client;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.BytesRestResponse;
import org.elasticsearch.rest.RestChannel;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.rest.RestRequest.Method;
import org.elasticsearch.rest.RestResponse;


public class HelloWorldHandler extends BaseRestHandler {

 //    
  @Inject
  protected HelloWorldHandler(Settings settings, RestController controller, Client client) {
 super(settings, controller, client);
 //  Handler    L   
 controller.registerHandler(Method.GET, "/hello/", this);
 controller.registerHandler(Method.GET, "/hello/{name}", this);
 }

 //         L 
 @Override
 protected void handleRequest(RestRequest request, RestChannel channel, Client client) throws Exception {
 logger.debug("HelloWorldAction.handleRequest called");
 final String name = request.hasParam("name") ? request.param("name") : "world";
 
 String content = "{\"success\":true, \"message\":\"hello " +name+ "\"}";
 
 RestResponse response = new BytesRestResponse(RestStatus.OK, BytesRestResponse.TEXT_CONTENT_TYPE, content);
 channel.sendResponse(response);
 }
}

마지막 으로 클래스 경로 루트 폴 더 에 es-plugin.properties 속성 파일 을 추가 하고 플러그 인 구현 클래스 를 지정 합 니 다.

plugin=org.elasticsearch.plugin.helloworld.HelloWorldPlugin
2.플러그 인 을 jar 패키지 로 만 든 후 설치
하면,만약,만약...HOME 대표 Elasticsearch 설치 폴 더.ES 에서HOME/plugins 폴 더 아래 HelloWorld 라 는 폴 더 를 만 듭 니 다.이 폴 더 의 이름 은 플러그 인 이름과 같 아야 합 니 다.(대문자 와 소문 자 구분)그리고 jar 패 키 지 를 HelloWorld 폴 더 로 복사 하고 다시 시작 하면 됩 니 다.실행 할 때:
curl-GET localhost:9200/hello,대응 결 과 를 되 돌려 줍 니 다.
3.플러그 인 을 위 한 페이지 추가
플러그 인 에 L 질문 페이지 를 추가 하고 싶다 고 가정 하 세 요.ESHOME/plugins/HelloWorld 폴 더 아래 에""라 는 이름 을 만 듭 니 다.site"의 폴 더 입 니 다.이 폴 더 의 이름 은 이 어야 합 니 다.site,그리고 대응 하 는 html 페이지 를site 폴 더 를 사용 하면 index.html 파일 이 라 고 가정 하면 통과 할 수 있 습 니 다.
localhost:9200/_plugin/HelloWorld/index.html 에서 L 문 을 진행 합 니 다.
Elasticsearch 가 jsclientAPI 를 제 공 했 기 때문이다.그래서 html 정적 페이지 와 js 를 사용 하면 대응 하 는 기능 을 완성 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기