Cochabamba – Bolivia
2018
2
Dedicatoria
A Dios por la fe y fortaleza, a mis padres Gabino y
Emiliana por el apoyo y a mi esposa Daniela por
toda la comprensión y paciencia al estar a mi lado
en esta etapa de mi vida.
3
4
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
TABLA DE CONTENIDOS
RESUMEN ..................................................................................................................................... 11
INTRODUCCION ........................................................................................................................... 13
1 GENERALIDADES ..................................................................................................................... 15
2 METODOLOGIA ......................................................................................................................... 15
3 ELASTICSEARCH...................................................................................................................... 16
5
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
6
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
4 CONCLUSIONES ....................................................................................................................... 49
5 BIBLIOGRAFÍA ........................................................................................................................... 50
7
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
8
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
9
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
10
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
RESUMEN
Se realizó una revisión bibliográfica que era relevante para los puntos de investigación que
fueron muy útiles al integrar Elasticsearch con Spring.
Cada uno de los temas fue expuesto de manera detallada, pero limitando la información
únicamente con la relación directa con el tema de investigación, de forma que se obtuvo una
comprensión clara de los puntos que se tratan.
Gracias a la puesta de campo con ejemplos claros en la integración de Spring con Elasticsearch
las empresas podrán implementar en su aplicación empresarial tomando como principio esta
investigación.
Se realizaron ejemplos de código fuente donde se observará cómo implementar paso a paso y
qué modificaciones realizar para integrar Elasticsearch, así se puede apoyar que no es muy
complejo realizar dicha integración.
Esta monografía se plantea como un estudio que puede otorgar la pauta para realizar otros
estudios relacionados con este tema, ya que Elasticsearch tiene funcionalidades avanzadas
para optimizar mucho mejor la aplicación empresarial.
11
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
12
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
INTRODUCCION
Los cambios que se realizarán en el proyecto SSI solo se aplicarán en el módulo de accidentes,
no se implementara clúster o características avanzadas de Elasticsearch que incluyan gran
cantidad de servidores.
13
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
14
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
1 GENERALIDADES
Elasticsearch es una base de datos nosql, motor de búsqueda y análisis de texto completo
altamente escalable y de código abierto. Le permite almacenar, buscar y analizar grandes
volúmenes de datos de forma rápida y casi en tiempo real. Elasticsearch ofrece formas de
ampliar las capacidades de búsqueda mediante el uso de API y consultas DSL. Hay clientes
disponibles para que se puedan usar con numerosos lenguajes de programación, como Java,
Ruby, PHP, JavaScript y otros.
2 METODOLOGIA
15
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
3 ELASTICSEARCH
16
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Por lo tanto, acorde a los conceptos mencionados se concluye que Elasticsearch es un motor
de búsqueda orientado a documentos JSON estructurados sin esquemas, desarrollado en JAVA
de código abierto, una de las principales características es que nos permite tener una
arquitectura distribuida, escalable y de alta disponibilidad.
Por lo tanto, Elasticsearch permite disponer en tiempo real de los últimos cambios realizados
sobre los datos.
Según (Bharvi, Rafał, Marek, & Saurabh, 2017, p. 52) Elasticsearch se distribuye desde el
primer día, y ha sido diseñado para escalar horizontalmente y no verticalmente. Se puede
comenzar con un clúster Elasticsearch de un solo nodo en su computadora portátil y puede
escalar ese clúster a cientos o miles de nodos sin preocuparse sobre las complejidades internas
que vienen con la computación distribuida, Almacenamiento de documentos distribuidos, y
búsquedas.
17
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Según (Bharvi, Rafał, Marek, & Saurabh, 2017, p. 52) La replicación de datos significa tener
múltiples copias de datos en su clúster. Esta característica permite a los usuarios crear
altamente clústeres disponibles manteniendo más de una copia de datos. Solo se
necesita emitir un comando simple, y crea automáticamente copias redundantes de los datos
para proporcionar mayores disponibilidades y evitar pérdida de datos en caso de fallo de la
máquina.
Además, que los clústeres de Elasticsearch son flexibles, estos son capaces de detectar y
eliminar nodos que estén fallando y reorganizarse a sí mismos para asegurar que los datos
estén a salvo y permanezcan accesibles.
Un clúster de Elasticsearch puede alojar múltiples índices, que podrán ser consultados de
manera independiente o en grupo. Además, asignando alias a los índices, permite añadir
índices al vuelo de manera transparente para la aplicación
Para buscar dentro de los campos de texto completo y los documentos más relevantes,
Elasticsearcch utiliza el algoritmo de similitud estándar que se conoce como frecuencia /
inversa frecuencia del documento TF/IDF, que toma en cuenta los siguientes factores:
18
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Según (Bharvi, Rafał, Marek, & Saurabh, 2017, p. 52) Las consultas DSL (domain-specific
language) es una interfaz JSON proporcionada por Elasticsearch para exponer el poder de
Lucene para escribir y leer consultas de una manera muy fácil. Gracias a la consulta DSL, los
desarrolladores que no conocen la sintaxis de consulta de Lucene
Elasticsearch provee mecanismos para asegurar que los datos nunca se pierdan debido
a cambios simultáneos sobre un mismo documento realizados por diferentes procesos.
Según (Bharvi, Rafał, Marek, & Saurabh, 2017, pp. 53-54) Sin esquemas significa que no tienes
que crear un esquema con nombres de campo y tipos de datos antes de indexar los datos en
Elasticsearch. Aunque es uno de los conceptos más incomprendidos, esta es una de las
mayores ventajas que hemos visto en muchas organizaciones, especialmente en los sectores
de comercio electrónico donde es difícil definir el esquema por adelantado en algunos casos.
Cuando envíes tu primer documento a Elasticsearch, hace todo lo posible para analizar cada
campo en el documento y crea un esquema en sí. La próxima vez, si envía otro documento con
19
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
un tipo de datos diferente para el mismo campo, se descartará el documento. Por lo tanto,
Elasticsearch no es completamente sin esquemas, pero es el comportamiento dinámico de
crear un esquema es muy útil.
Entonces se entiende que Elasticsearch permite trabajar sin esquemas que definan la
estructura de los datos. Simplemente pasándole un documento JSON intentará detectar la
estructura de los datos, indexarlos y hacer que sean accesibles para las búsquedas.
Según (Bharvi, Rafał, Marek, & Saurabh, 2017, p. 52) Elasticsearch se basa en la arquitectura
REST y proporciona puntos finales de la API para no solo realizar operaciones CRUD sobre
llamadas API HTTP, también permitir que los usuarios realicen monitoreo de clústeres y tareas
utilizando API REST. Los puntos finales REST también permiten a los usuarios hacer cambios a
los grupos e índices de configuración de forma dinámica, en lugar de hacerlo manualmente las
actualizaciones de configuración a todos los nodos en un clúster, editando el archivo
elasticsearch.yml y reiniciando el nodo. Esto es posible porque cada recurso (índice,
documento, nodo, etc.) en Elasticsearch es accesible a través de un simple URI como se
muestra en la figura.
Figura 2 - URI de un documento en Elasticsearch (Bharvi, Rafał, Marek, & Saurabh, 2017)
20
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Elasticsearch vela por la seguridad de los datos. Todos los cambios que se realizan sobre los
documentos se almacenan en logs de transacciones en múltiples nodos del clúster para
minimizar las pérdidas de información.
3.2.13 Velocidad
Es código abierto y está bajo la licencia Apache 2. Permite descargar, usar y modificar el
código.
3.2.15 Multiplataforma
Puede utilizarse en diversos entornos o sistemas operativos como Windows, Mac Os y las
distintas distribuciones GNU Linux como Ubuntu o Debian.
La arquitectura de Elasticsearch está compuesta por clúster, nodos, índices, tipo, mapping,
documento, fragmentos y replicas que mantienen toda la información de manera distribuida e
indexada.
En la tabla 1 se hace una comparación de Elasticsearch con una base de datos relacional.
3.3.1 Clúster
Un clúster es una colección de uno o más nodos (servidores) que, en conjunto, conservan sus
datos completos y proporcionan capacidades de búsqueda e indexación en todos los nodos. Un
clúster se identifica con un nombre único que, de forma predeterminada, es "elasticsearch".
Este nombre es importante porque un nodo solo puede ser parte de un clúster si el nodo está
configurado para unirse al clúster por su nombre según (Elastic, 2018, p. basic_concepts).
21
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Index Database
Type Table
Document Row
Mapping Schema
Fields columns
3.3.2 Nodo
Una sola instancia de Elasticsearch ejecutándose en una máquina según según (Bharvi, Rafał,
Marek, & Saurabh, 2017, p. 55).
Un nodo es un único servidor que forma parte de su clúster, almacena sus datos y participa en
las capacidades de búsqueda e indexación del clúster. Al igual que un clúster, un nodo se
identifica con un nombre que, de forma predeterminada, es un identificador universal único
aleatorio (UUID) que se asigna al nodo en el inicio. Puede definir cualquier nombre de nodo que
desee si no desea el valor predeterminado. Este nombre es importante para fines de
administración en los que desea identificar qué servidores de su red corresponden a qué nodos
en su grupo de Elasticsearch según (Elastic, 2018, p. basic_concepts).
3.3.3 Índice
22
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
3.3.4 Tipo
Según (Gupta, 2015) Esto es similar a una tabla en una base de datos relacional tradicional.
Contiene una lista de Campos, que se definen para cada documento. Un tipo es una
segregación lógica de indices, cuya interpretación y la semántica depende totalmente de los
desarrolladores. Por ejemplo, tu tiene datos sobre el mundo y usted pone todos sus datos en un
índice. En este índice, usted puede definir un tipo para datos de continente, otro tipo para datos
de país y un Tercer tipo para datos por región. Los tipos se utilizan con una API de mapeo;
especifica el Tipo de su campo. Un ejemplo de mapeo de tipos es el siguiente:
"usuario": {
"properties": {
"nombre": {
"type": "string"
},
"edad": {
"type": "integer"
},
"fecha_nacimiento”: {
"type": "date"
},
"balance_banco": {
"type": "float"
23
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
3.3.5 Mapping
Es similar al esquema de una base de datos, describe los campos de un documento, como
debe ser indexado.
3.3.6 Documento
Según (Bharvi, Rafał, Marek, & Saurabh, 2017, p. 55), el documento es un objeto JSON que
contiene los datos reales en pares de valores clave.
Por lo tanto, un documento es una unidad básica de información que puede ser indexado.
24
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Por lo tanto, un índice puede almacenar una gran cantidad de datos que puede exceder los
límites de hardware de un solo nodo.
Un caso práctico es cuando Dell implementó usar Elasticsearch para apoyar la búsqueda de
comercio electrónico para más de 60 países en más de 21 idiomas. El equipo de búsqueda de
Dell tiene 30 miembros. Han visto la importancia de la búsqueda avanzada ya que las
expectativas de compra del consumidor se centraron más en la gratificación instantánea.
Ofrecer exactamente el resultado que un consumidor busca comprar los mantiene
continuamente innovando, expandiendo las capacidades de relevancia y personalización de la
plataforma.
Para trabajar con un ejemplo completo y real de aplicación con Elasticsearch se utilizará el
sistema de seguridad industrial SSI, que fue desarrollado en el diplomado con el fin de disminuir
la incidencia de accidentes en las empresas constructoras, con los objetivos de registrar el
manual de funciones para controlar el cumplimiento laboral, registrar asignación de equipos y
maquinaria al personal, registrar incidencias de accidentes dentro de la empresa, generar
reportes que ayuden a la correcta toma de decisiones.
25
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
El sistema fue construido en dos partes el API REST en el lenguaje java con el framework
Spring y el frontend con Angular.
Por lo tanto, la mejora que se realizará y aportará será en el modulo de accidentes con la
integración de Elasticsearch para aprovechar todas las características que nos ofrece.
java -version
echo $JAVA_HOME
Para la instalación se mostrará los pasos para el sistema operativo GNU Linux Ubuntu Server
16.04 LTS.
Continuando con la instalación según (Elastic, 2018, p. installation), una vez que tengamos Java
configurado, podemos descargar y ejecutar Elasticsearch. Los binarios están disponibles en
www.elastic.co/downloads. Puede elegir entre un archivo zip o tar, un paquete DEB o RPM, o
un paquete de instalación de Windows MSI para este proyecto descargaremos la opción de
comprimido tar de Elasticsearch 6.4.2.
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.tar.gz
26
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
./elasticsearch
Se puede anular el nombre del clúster o del nodo. Esto se puede hacer desde la línea de
comandos al iniciar Elasticsearch de la siguiente manera:
./elasticsearch -Ecluster.name=my_cluster -Enode.name=my_node
También tenga en cuenta la línea marcada http con información sobre la dirección HTTP
(127.0.0.1) y el puerto (9200) desde donde se puede acceder a nuestro nodo. De forma
predeterminada, Elasticsearch utiliza el puerto 9200 para proporcionar acceso a su API REST.
Este puerto es configurable si es necesario.
Ahora que tenemos nuestro nodo (y clúster) en funcionamiento, el siguiente paso es entender
cómo interactuar con él. Elasticsearch proporciona una API REST muy completa y potente que
puede utilizar para interactuar con su clúster.
Para comprobar el estado nos será útil el siguiente comando
Respuesta esperada
{
"ok": true,
"status": 200,
"name": "BTA",
"version": {
"number": "0.90.2",
"snapshot_build": false,
"lucene_version": "4.3.1"
},
27
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Comencemos por crear nuestro primer índice y darle un nombre a este índice, que es ssi en
este caso. Después de ejecutar el siguiente comando, un índice con cinco fragmentos y una
réplica:
Se creara un índice con el nombre de “ssi” de la siguiente manera siguiendo los pasos según
(Elastic, 2018, p. _create_an_index)
Para ver los índices actuales nos será útil el siguiente comando
Lo siguiente será trabajar con el mapping, el mapeo no es necesario definirlo previamente, pero
es aconsejable para ciertas propiedades sino queremos que Elasticsearch tome valores por
defecto o haga suposiciones, a continuación, insertamos los documentos. Cada documento
tiene un identificativo que deberemos asignarle y para indexar básicamente proporcionamos un
JSON con las propiedades del documento. Elasticsearch se encargará de indicarlo para que
una búsqueda posterior se ejecute rápidamente.
28
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
u otra alternativa
{
"ok": true,
"_index": "ssi",
"_type": "accidentes",
"_id": "1",
"_version": 1
}
29
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
las características más importantes son las búsquedas un ejemplo de ello sería el siguiente:
30
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Exploramos los conceptos básicos de Spring Data con Elasticsearch de una manera práctica y
centrada en el código aplicando al proyecto SSI Sistema de seguridad Industrial. Mostraremos
cómo indexar, buscar y consultar Elasticsearch en Spring utilizando Spring Data, este módulo
de Spring es útil para interactuar con el motor de búsqueda de código abierto basado en
Lucene.
Aunque Elasticsearch no tiene esquemas, puede usar asignaciones para decir el tipo de campo.
Cuando un documento está indexado, sus campos se procesan según sus tipos. Por ejemplo,
un campo de texto se convertirá en token y se filtra según las reglas de mapeo. También puede
crear filtros y tokenizadores propios.
Según (Team, 2018), El proyecto Spring Data Elasticsearch aplica los conceptos básicos de
Spring al desarrollar soluciones utilizando Elasticsearch. Tiene un template que es una
abstracción de alto nivel para almacenar, consultar, clasificar y realizar búsquedas de
documentos.
Por lo tanto, Spring Data ayuda a evitar el código repetitivo. Por ejemplo, si definimos una
interfaz de repositorio que implemente la interfaz ElasticsearchRepository proporcionada por
Spring Data Elasticsearch, las operaciones de CRUD para la clase de documento
correspondiente estarán disponibles de forma predeterminada. Además, simplemente al
declarar métodos con nombres en un formato predefinido, las implementaciones de métodos se
generan y no es necesario escribir una implementación de la interfaz del repositorio.
Para tener más información sobre el uso de Spring Data recomendamos revisar la
documentación oficial http://projects.spring.io/spring-data/ .
Spring Data Elasticsearch proporciona una API de Java para el motor de búsqueda. Para
usarlo, necesitamos agregar una nueva dependencia al pom.xml entre los tags
“dependencies”:
31
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>${spring-data-elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
32
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
<artifactId>jna</artifactId>
<version>${jna.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
package com.dh.spring5webapp;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import
org.springframework.data.elasticsearch.repository.config.EnableElasticsearchReposit
ories;
@Configuration
@EnableElasticsearchRepositories(basePackages =
33
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
"com.dh.spring5webapp.repositories")
@ComponentScan(basePackages = { "com.dh.spring5webapp.services" })
public class ElasticConfig {
@Value("${elasticsearch.home:/home/danita/ELK/elasticsearch-6.3.2}")
private String elasticsearchHome;
@Value("${elasticsearch.cluster.name:elasticsearch}")
private String clusterName;
@Bean
public Client client() {
TransportClient client = null;
try {
final Settings elasticsearchSettings = Settings.builder()
.put("client.transport.sniff", true)
.put("path.home", elasticsearchHome)
.put("cluster.name", clusterName).build();
client = new PreBuiltTransportClient(elasticsearchSettings);
client.addTransportAddress(new
InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
} catch (UnknownHostException e) {
e.printStackTrace();
}
return client;
}
34
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchTemplate(client());
}
}
Tenga en cuenta que estamos utilizando una anotación de estilo de habilitación Spring estándar
@EnableElasticsearchRepositories para escanear el paquete proporcionado para los
repositorios de Spring Data.
package com.dh.spring5webapp.repositories;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import com.dh.spring5webapp.model.Accidente;
35
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
@Repository
public interface AccidenteRepository
extends ElasticsearchRepository<Accidente, String> {
Page<Accidente> findByEmpleadosNombre(String nombre, Pageable pageable);
package com.dh.spring5webapp.services;
36
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
import java.util.Optional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import com.dh.spring5webapp.model.Accidente;
Iterable<Accidente> findAll();
Page<Accidente> findByEmpleadosNombreAndFilteredTagQuery(String
nombre, String tag, Pageable pageable);
long count();
37
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Definición de la implementación
package com.dh.spring5webapp.services;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.dh.spring5webapp.model.Accidente;
import com.dh.spring5webapp.repositories.AccidenteRepository;
@Service
public class AccidenteServiceImpl implements AccidenteService {
@Autowired
public AccidenteServiceImpl(AccidenteRepository accidenteRepository) {
this.accidenteRepository = accidenteRepository;
}
@Override
public Accidente save(Accidente accidente) {
return accidenteRepository.save(accidente);
}
38
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
@Override
public Optional<Accidente> findOne(String id) {
return accidenteRepository.findById(id);
}
@Override
public Iterable<Accidente> findAll() {
return accidenteRepository.findAll();
}
@Override
public Page<Accidente> findByEmpleadoNombre(String nombre, Pageable
pageable) {
return accidenteRepository.findByEmpleadosNombre(nombre, pageable);
}
@Override
public Page<Accidente> findByEmpleadoNombreUsingCustomQuery(String
nombre, Pageable pageable) {
return
accidenteRepository.findByEmpleadosNombreUsingCustomQuery(nombre,
pageable);
}
@Override
public Page<Accidente> findByFilteredTagQuery(String tag, Pageable pageable)
{
39
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
@Override
public Page<Accidente> findByEmpleadosNombreAndFilteredTagQuery(String
nombre, String tag, Pageable pageable) {
return
accidenteRepository.findByEmpleadosNombreAndFilteredTagQuery(nombre, tag,
pageable);
}
@Override
public long count() {
return accidenteRepository.count();
}
@Override
public void delete(Accidente accidente) {
accidenteRepository.delete(accidente);
}
}
3.7.6 Mapping
package com.dh.spring5webapp.model;
import static
40
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
org.springframework.data.elasticsearch.annotations.FieldType.Keyword;
import static org.springframework.data.elasticsearch.annotations.FieldType.Nested;
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
import java.util.Arrays;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
@Id
private String id;
@Field(type = Keyword)
41
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
public Accidente() {
}
42
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
@Override
public String toString() {
return "Accidente{" + "id='" + id + '\'' + ", titulo='" + titulo + '\'' + ", empleados=" +
empleados + ", tags=" + Arrays.toString(tags) + '}';
}
}
package com.dh.spring5webapp.model;
public class Empleado {
private String nombre;
public Empleado() {
}
43
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Tenga en cuenta que en la anotación @Document, indicamos que las instancias de esta clase
se deben almacenar en Elasticsearch en un índice llamado "ssi", y con un tipo de documento
de "accidente". Los documentos con muchos tipos diferentes se pueden almacenar en el
mismo índice. También observe que el campo de empleados está marcado como
FieldType.Nested. Esto nos permite definir la clase Empleado por separado, pero tener las
instancias individuales de empleado incrustadas en un documento Accidente cuando está
indexado en Elasticsearch.
Un vistazo rápido a un ejemplo para indexar un accidente con dos empleados que participaron:
@GET
@Path("/test-elk")
public Accidente getAccidentById() {
Accidente accidente = new Accidente("Accidente ELK 1");
44
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
3.7.8 Consultas
Existen dos formas de definir consultas personalizadas para los repositorios Spring Data
Elasticsearch. Una forma es usar la anotación @Query, como se demostró en la sección 3.7.4.
Otra opción es usar un generador para la creación de consultas personalizadas. Por ejemplo,
podríamos buscar accidentes que tengan la palabra "accidente" en el título construyendo una
consulta con NativeSearchQueryBuilder:
45
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Para actualizar o eliminar un documento, primero tenemos que recuperar ese documento.
Ahora, para actualizar el título del artículo, podemos modificar el documento y usar la API de
guardado:
accidenteService.delete(accidente);
3.8 Kibana
Según (Elastic, 2018) Kibana es una plataforma de análisis y visualización de código abierto
diseñada para trabajar con Elasticsearch. Se utiliza Kibana para buscar, ver e interactuar con
los datos almacenados en los índices de Elasticsearch. Se puede realizar fácilmente análisis de
datos avanzados y visualizar sus datos en una variedad de cuadros, tablas y mapas.
Según (Gupta, 2015, pág. 46), Kibana es una herramienta que forma parte de la familia de ELK,
que consta de Elasticsearch, Logstash, y Kibana. Está construido y desarrollado por Elastic.
46
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
Configurar Kibana es muy sencillo. Se puede instalar Kibana y comenzar a explorar sus índices
de Elasticsearch en minutos, sin necesidad de código ni infraestructura adicional.
Para practicar las consultas a la API de Elasticsearch se tiene la opción de “Dev Tools” como se
observa en la figura 4.
Las cuales nos permite compartir ya sea el dashboard o la visualización como un <iframe>, el
cual lo podemos integrar a nuestros proyectos usando simple HTML.
47
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
48
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
4 CONCLUSIONES
Se recomienda a toda persona interesada que desarrolle una aplicación empresarial en java
considerar el uso de Elasticsearch para obtener todos los beneficios que nos ofrece.
49
Mejora de SSI con el uso de Elasticsearch en Spring – Juan Pablo Mejia
5 BIBLIOGRAFÍA
Bharvi, D., Rafał, K., Marek, R., & Saurabh, C. (2017). Elasticsearch: A Complete Guide. Packt
Publishing.
RADU, G., MATTHEW, H. L., & ROY , R. (2016). Elasticsearch in action. Manning Publications
Co.
50