En este módulo, aprenderemos cómo extender la funcionalidad de Elasticsearch mediante la creación de plugins personalizados. Los plugins permiten a los desarrolladores añadir nuevas características, modificar el comportamiento existente y optimizar el rendimiento de Elasticsearch para casos de uso específicos.

¿Qué es un Plugin en Elasticsearch?

Un plugin en Elasticsearch es un componente adicional que se puede instalar para extender o modificar la funcionalidad del núcleo de Elasticsearch. Los plugins pueden proporcionar nuevas funcionalidades, como analizadores personalizados, tipos de búsqueda, scripts, y más.

Tipos de Plugins

  1. Plugins de Análisis: Añaden nuevos analizadores, tokenizadores y filtros de tokens.
  2. Plugins de Búsqueda: Introducen nuevas consultas y tipos de búsqueda.
  3. Plugins de Ingestión: Añaden nuevos procesadores para pipelines de ingestión.
  4. Plugins de Seguridad: Mejoran las capacidades de seguridad, como autenticación y autorización.
  5. Plugins de Monitoreo: Proveen nuevas métricas y capacidades de monitoreo.

Creando un Plugin Personalizado

Requisitos Previos

  • Conocimientos básicos de Java.
  • Entorno de desarrollo configurado con JDK y Maven.
  • Elasticsearch instalado y funcionando.

Estructura de un Plugin

Un plugin de Elasticsearch generalmente sigue una estructura de proyecto Maven. Aquí hay un ejemplo de la estructura básica:

my-custom-plugin/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── org/
│   │   │       └── example/
│   │   │           └── MyCustomPlugin.java
│   │   └── resources/
│   │       └── plugin-descriptor.properties
├── pom.xml

Paso 1: Configurar el Proyecto Maven

Crea un archivo pom.xml en la raíz del proyecto con el siguiente contenido:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>my-custom-plugin</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.10.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Paso 2: Crear el Descriptor del Plugin

Crea un archivo plugin-descriptor.properties en src/main/resources con el siguiente contenido:

description=My Custom Plugin
version=1.0.0
name=my-custom-plugin
classname=org.example.MyCustomPlugin
java.version=1.8
elasticsearch.version=7.10.0

Paso 3: Implementar la Clase del Plugin

Crea la clase principal del plugin MyCustomPlugin.java en src/main/java/org/example:

package org.example;

import org.elasticsearch.plugins.Plugin;

public class MyCustomPlugin extends Plugin {
    // Aquí puedes añadir la lógica de tu plugin
}

Paso 4: Compilar y Empaquetar el Plugin

Ejecuta el siguiente comando Maven para compilar y empaquetar el plugin:

mvn clean package

Esto generará un archivo JAR en el directorio target.

Paso 5: Instalar el Plugin en Elasticsearch

Copia el archivo JAR generado al directorio de plugins de Elasticsearch y reinicia el servicio:

cp target/my-custom-plugin-1.0.0.jar $ES_HOME/plugins/my-custom-plugin/
$ES_HOME/bin/elasticsearch-plugin install file://$ES_HOME/plugins/my-custom-plugin/my-custom-plugin-1.0.0.jar
$ES_HOME/bin/elasticsearch -d

Ejemplo Práctico: Añadiendo un Analizador Personalizado

Vamos a extender nuestro plugin para añadir un analizador personalizado.

Paso 1: Implementar el Analizador

Añade la siguiente clase MyCustomAnalyzer.java:

package org.example;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;

public class MyCustomAnalyzer extends Analyzer {
    @Override
    protected TokenStreamComponents createComponents(String fieldName) {
        WhitespaceTokenizer tokenizer = new WhitespaceTokenizer();
        return new TokenStreamComponents(tokenizer);
    }
}

Paso 2: Registrar el Analizador en el Plugin

Modifica MyCustomPlugin.java para registrar el analizador:

package org.example;

import org.elasticsearch.index.analysis.AnalyzerProvider;
import org.elasticsearch.index.analysis.PreBuiltAnalyzerProviderFactory;
import org.elasticsearch.indices.analysis.AnalysisModule;
import org.elasticsearch.plugins.AnalysisPlugin;
import org.elasticsearch.plugins.Plugin;

import java.util.HashMap;
import java.util.Map;

public class MyCustomPlugin extends Plugin implements AnalysisPlugin {
    @Override
    public Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<?>>> getAnalyzers() {
        Map<String, AnalysisModule.AnalysisProvider<AnalyzerProvider<?>>> analyzers = new HashMap<>();
        analyzers.put("my_custom_analyzer", (indexSettings, environment, name, settings) ->
                new PreBuiltAnalyzerProviderFactory(name, AnalyzerScope.GLOBAL, new MyCustomAnalyzer()).get());
        return analyzers;
    }
}

Paso 3: Recompilar e Instalar el Plugin

Recompila el plugin y reinstálalo en Elasticsearch siguiendo los pasos anteriores.

Ejercicio Práctico

Ejercicio

  1. Crea un plugin que añada un nuevo tipo de búsqueda personalizada.
  2. Implementa la lógica de la búsqueda en una clase separada.
  3. Registra la búsqueda en la clase principal del plugin.
  4. Compila, empaqueta e instala el plugin en Elasticsearch.
  5. Realiza una búsqueda utilizando tu nuevo tipo de búsqueda.

Solución

  1. Implementar la Búsqueda Personalizada:
package org.example;

import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.plugins.SearchPlugin;
import org.elasticsearch.search.internal.SearchContext;

public class MyCustomQueryBuilder extends QueryBuilder {
    @Override
    protected void doXContent(XContentBuilder builder, Params params) throws IOException {
        // Implementa la lógica de serialización aquí
    }

    @Override
    protected Query doToQuery(QueryShardContext context) throws IOException {
        // Implementa la lógica de la búsqueda aquí
        return QueryBuilders.matchAllQuery().toQuery(context);
    }

    @Override
    protected boolean doEquals(QueryBuilder other) {
        return other instanceof MyCustomQueryBuilder;
    }

    @Override
    protected int doHashCode() {
        return 0;
    }
}
  1. Registrar la Búsqueda en el Plugin:
package org.example;

import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.plugins.SearchPlugin;

import java.util.List;

public class MyCustomPlugin extends Plugin implements SearchPlugin {
    @Override
    public List<QuerySpec<?>> getQueries() {
        return List.of(new QuerySpec<>("my_custom_query", MyCustomQueryBuilder::new, MyCustomQueryBuilder::fromXContent));
    }
}
  1. Compilar e Instalar:

Sigue los pasos anteriores para compilar e instalar el plugin.

  1. Realizar una Búsqueda:
POST /my_index/_search
{
  "query": {
    "my_custom_query": {}
  }
}

Conclusión

En este módulo, hemos aprendido cómo crear y registrar un plugin personalizado en Elasticsearch. Los plugins son una poderosa herramienta para extender las capacidades de Elasticsearch y adaptarlo a necesidades específicas. Con esta base, puedes explorar y desarrollar plugins más complejos para mejorar tus soluciones de búsqueda y análisis.

© Copyright 2024. Todos los derechos reservados