Dans cette série, j'expliquerai la manière de base d'écrire un plugin pour Elastic search. La partie 1 créera une API REST qui affiche "Hello World". La source créée peut être trouvée sur github.
Créez un plug-in Elasticsearch qui affichera "Hello Wolrd" lorsque vous accédez à l'URL spécifiée.
Utilisez le plug-in Gradle pour créer un plug-in Elasticsearch. Ce plug-in est inclus dans l'OSS d'Elasticsearch, mais il y a peu de documents, etc., et les spécifications de fonctionnement peuvent changer en raison de mises à niveau majeures de version, etc. Par conséquent, il est nécessaire de prendre en compte ces risques lors de son utilisation. Il semble que la source de téléchargement du module Elasticsearch soit l'URL interne du plug-in Gradle de la série 7. En conséquence, le plug-in gradle ne parvient pas à lancer Elasticsearch pour les tests. Dans ce didacticiel, vous allez télécharger Elasticsearch séparément, installer manuellement le plug-in et lancer Elasticsearch.
** Le plug-in Gradle pour Elasticsearch 7.4.2 nécessite Java 12 ou supérieur. Gradle 6.0 est requis pour fonctionner avec Java 13). Pour cette raison, cette combinaison est actuellement utilisée lors de la création d'un plug-in Elasticsearch 7.4.) **
--Installer Elasticsearch version OSS Développer jusqu'à [ELASTICSEARCH_DIR] --Installez Gradle version RC Développer jusqu'à [GRADLE_DIR]
Le projet doit être placé dans [PROJECT_DIR].
--place la source java qui est la source de la classe fournie dans src / main / java jar. --Placez diverses ressources regroupées dans le jar src / main / resources. --src / main / plugin-metadata Placez des paramètres uniques pour les plugins Eclipse tels que les politiques de sécurité. --src / test / java Place la source java pour le test. --src / test / resources Place diverses ressources pour les tests. --settings.gradle Ce fichier est nécessaire pour définir la configuration du projet. --build.gradle Ce fichier est nécessaire pour définir les tâches lors de la construction d'un projet.
Puisqu'il s'agit d'une configuration de projet unique, spécifiez uniquement le nom du projet. Le nom du projet sera le préfixe du fichier jar ou le nom du projet lors de l'importation dans un environnement de développement tel qu'Eclipse.
rootProject.name = 'elasticsearch-sample-plugins'
Définissez des paramètres spécifiques pour créer la version JVM (targetVersion) de l'environnement d'exploitation et du plug-in Elasticsearch.
buildscript {
repositories {
mavenLocal()
mavenCentral()
jcenter()
}
dependencies {
// Elasticsearch publie des outils de construction dans le référentiel central de 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 requis pour résoudre les dépendances
id 'maven'
// Requis lors de l'utilisation d'Eclipse comme environnement de développement
id 'eclipse'
}
// Le nom du plug Gradle pour construire le plug
apply plugin: 'elasticsearch.esplugin'
sourceCompatibility = 1.8
// Assurez-vous que le runtime Elasticsearch fonctionne avec JDK 1.8.
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 {
// Si vous ne définissez pas les deux suivants, la construction du plug-in entraînera une erreur
licenseFile = project.file('LICENSE')
noticeFile = project.file('NOTICE')
}
esplugin {
// Nom du plugin
name project.name
// Description du plugin
description 'Elasticsearch sample plugin'
// Classe qui est l'entrée de la prise
classname 'taka8.elasticsearch.plugins.SamplePlugin'
}
Créez une classe avec le nom de classe (FQCN) défini dans esplugin.classname de build.gradle sous "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;
//Lors de la création d'un plugin pour l'API REST, vous devez implémenter l'ActionPlugin.
public class SamplePlugin extends Plugin implements ActionPlugin {
//Renvoie une liste de RestHandlers définis par ce plugin
@Override
public List<RestHandler> getRestHandlers(Settings settings, RestController restController,
ClusterSettings clusterSettings, IndexScopedSettings indexScopedSettings, SettingsFilter settingsFilter,
IndexNameExpressionResolver indexNameExpressionResolver, Supplier<DiscoveryNodes> nodesInCluster) {
return Arrays.asList(//
//Classe définie à l'origine(Renvoyer la chaîne Hello World
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 qui accepte l'API REST est facile à créer en héritant de BaseRestHandler
public class HelloWorldAction extends BaseRestHandler {
public HelloWorldAction(final RestController controller) {
assert controller != null;
//Définissez le chemin pour accepter la demande.
controller.registerHandler(GET, "/hello", this);
controller.registerHandler(HEAD, "/hello", this);
}
//Définissez le nom de RestHandler.
//Rendez le nom facile à voir pour les gens.
//Utilisé dans les API qui retournent l'utilisation
@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");
//Ecrire une réponse à la chaîne
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 doit être en notation URL **
>cd [ELASTICSEARCH_DIR]
>.\bin\elasticsearch
Allez sur http : // localhost: 9200 / hello avec votre navigateur et vérifiez que "Hello World" est affiché.
J'ai trouvé facile de créer des plugins Elasticsearch en utilisant le plugin Gradle pour créer des plugins. Cela n'a pas de sens dans le développement réel, mais Elasticsearch a en fait une partie d'accès à l'API créée presque de la même manière qu'un plug-in, vous pouvez donc créer un plug-in assez performant. Dès la prochaine fois, j'expliquerai comment créer des plug-ins plus avancés.
Recommended Posts