In dieser Serie werde ich die grundlegende Methode zum Schreiben eines Plugins für Elastic Search erläutern. Teil 1 erstellt eine REST-API, die "Hello World" anzeigt. Die erstellte Quelle finden Sie unter github.
Erstellen Sie ein Elasticsearch-Plugin, das "Hello Wolrd" anzeigt, wenn Sie auf die angegebene URL zugreifen.
Verwenden Sie das Gradle-Plug-In, um ein Elasticsearch-Plugin zu erstellen. Dieses Plug-In ist in Elasticsearchs OSS enthalten, es gibt jedoch fast keine Dokumente, und die Betriebsspezifikationen können sich aufgrund größerer Versions-Upgrades ändern. Daher ist es notwendig, diese Risiken bei der Verwendung zu berücksichtigen. Es scheint, dass die Downloadquelle des Elasticsearch-Moduls die interne URL für das Gradle-Plug-In der 7er-Serie ist. Infolgedessen kann das Gradle-Plug-In Elasticsearch nicht zum Testen starten. In diesem Tutorial laden Sie Elasticsearch separat herunter, installieren das Plugin manuell und starten Elasticsearch.
** Für das Gradle-Plug-In für Elasticsearch 7.4.2 ist Java 12 oder höher erforderlich. Gradle 6.0 ist erforderlich, um mit Java zu arbeiten 13). Aus diesem Grund wird diese Kombination derzeit beim Erstellen eines Elasticsearch 7.4-Plug-Ins verwendet.) **
--Installieren Sie Elasticsearch OSS-Version. Erweitern Sie auf [ELASTICSEARCH_DIR].
Das Projekt wird in [PROJECT_DIR] platziert.
Da dies eine einzelne Projektkonfiguration ist, geben Sie nur den Projektnamen an. Der Projektname ist das Präfix der JAR-Datei oder der Projektname, wenn er in eine Entwicklungsumgebung wie Eclipse importiert wird.
rootProject.name = 'elasticsearch-sample-plugins'
Nehmen Sie spezielle Einstellungen zum Erstellen der JVM-Version (Zielversion) der Betriebsumgebung und des Elasticsearch-Plug-Ins vor.
buildscript {
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
dependencies {
// Elasticsearch veröffentlicht Build-Tools im zentralen Repository von maven.
// https://mvnrepository.com/artifact/org.elasticsearch.gradle/build-tools
classpath group: 'org.elasticsearch.gradle', name: 'build-tools', version: '7.4.2'
}
}
plugins {
id 'java'
// Maven erforderlich, um Abhängigkeiten aufzulösen
id 'maven'
// Erforderlich, wenn Eclipse als Entwicklungsumgebung verwendet wird
id 'eclipse'
}
// Der Name des Gradle-Plugins zum Erstellen des Plugins
apply plugin: 'elasticsearch.esplugin'
sourceCompatibility = 1.8
// Stellen Sie sicher, dass die Elasticsearch-Laufzeit mit JDK 1.8 funktioniert.
targetCompatibility = 1.8
group = 'taka8.elasticsearch.plugins'
version = '0.0.1'
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
eclipse {
classpath {
containers.clear()
downloadSources = true
downloadJavadoc = true
}
}
ext {
// Wenn Sie die folgenden beiden nicht festlegen, führt der Plug-In-Build zu einem Fehler
licenseFile = project.file('LICENSE')
noticeFile = project.file('NOTICE')
}
esplugin {
// Plugin Name
name project.name
// Plugin Beschreibung
description 'Elasticsearch sample plugin'
// Klasse, die der Eingang zum Stecker ist
classname 'taka8.elasticsearch.plugins.SamplePlugin'
}
Erstellen Sie eine Klasse mit dem Klassennamen (FQCN) in esplugin.classname von build.gradle unter "src / main / java".
SamplePlugin.java
package taka8.elasticsearch.plugins;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.node.DiscoveryNodes;
import org.elasticsearch.common.settings.ClusterSettings;
import org.elasticsearch.common.settings.IndexScopedSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsFilter;
import org.elasticsearch.plugins.ActionPlugin;
import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestHandler;
import taka8.elasticsearch.rest.HelloWorldAction;
//Wenn Sie ein Plugin für die REST-API erstellen, müssen Sie das ActionPlugin implementieren.
public class SamplePlugin extends Plugin implements ActionPlugin {
//Gibt eine Liste der von diesem Plugin definierten RestHandler zurück
@Override
public List<RestHandler> getRestHandlers(Settings settings, RestController restController,
ClusterSettings clusterSettings, IndexScopedSettings indexScopedSettings, SettingsFilter settingsFilter,
IndexNameExpressionResolver indexNameExpressionResolver, Supplier<DiscoveryNodes> nodesInCluster) {
return Arrays.asList(//
//Ursprünglich definierte Klasse(Return Hello World String
new HelloWorldAction(restController));
}
}
HelloWorldAction.java
package taka8.elasticsearch.rest;
import static org.elasticsearch.rest.RestRequest.Method.GET;
import static org.elasticsearch.rest.RestRequest.Method.HEAD;
import java.io.IOException;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.BytesRestResponse;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.RestResponse;
import org.elasticsearch.rest.RestStatus;
//RestHandler, der die REST-API akzeptiert, kann einfach durch Erben von BaseRestHandler erstellt werden
public class HelloWorldAction extends BaseRestHandler {
public HelloWorldAction(final RestController controller) {
assert controller != null;
//Definieren Sie den Pfad zum Akzeptieren der Anforderung.
controller.registerHandler(GET, "/hello", this);
controller.registerHandler(HEAD, "/hello", this);
}
//Definieren Sie den Namen von RestHandler.
//Machen Sie den Namen für die Menschen leicht sichtbar.
//Wird in APIs verwendet, die die Verwendung zurückgeben
@Override
public String getName() {
return "hello_word_action";
}
@Override
protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
return channel -> {
RestResponse response = new BytesRestResponse(RestStatus.OK, "Hello World");
//Schreiben Sie eine Antwort auf den Kanal
channel.sendResponse(response);
};
}
}
>set JAVA_HOME=[JAVA_DIR]
>set PATH=[GRADLE_DIR]\bin;%PATH%
>gradle install
>cd [ELASTICSEARCH_DIR]
>.\bin\elasticsearch-plugin install file:/[PROJECT_DIR]/build/distributions/elasticsearch-sample-plugins-0.0.1.zip
** PROJECT_DIR sollte in URL-Notation sein **
>cd [ELASTICSEARCH_DIR]
>.\bin\elasticsearch
Gehen Sie mit Ihrem Browser zu http : // localhost: 9200 / hello und überprüfen Sie, ob "Hello World" angezeigt wird.
Ich fand es einfach, Elasticsearch-Plugins mit dem Gradle-Plugin zum Erstellen von Plugins zu erstellen. Dies ist in der tatsächlichen Entwicklung wenig sinnvoll, aber Elasticsearch verfügt tatsächlich über einen API-Zugriffsteil, der fast genauso wie ein Plug-In erstellt wurde, sodass Sie ein Plug-In mit relativ hoher Leistung erstellen können. Ab dem nächsten Mal werde ich erklären, wie erweiterte Plug-Ins erstellt werden.
Recommended Posts