Elasticsearch es un motor de búsqueda orientado a documentos JSON estructurados, desarrollado en JAVA de código abierto, una de las características principales es que podemos tener una arquitectura escalable, distribuida y de alta disponibilidad, se basa en Lucene para las búsqueda de texto. Las búsquedas el cual soporta multi-idioma, geolocalización, autocompletado, sugerencias, es ideal para proyectos en donde se trabajan con un alto volumen de datos, big data por ejemplo.
Hay algunos conceptos de Elasticsearch que debemos revisar y que nos ayudará a facilitar el proceso de aprendizaje.
Arquitectura
BD Relacional | Elastisearch |
database | index |
table | type |
row | Document |
schema | mapping |
SQL | query DSL |
Características de elasticsearch
- Motor de búsqueda OpenSource
- Capacidades de búsqueda y análisis en tiempo real mediante peticiones GET
- Útil para soluciones NoSQL (sin transacciones distribuidas)
- Permite utilizarlo sobre el ecosistema Hadoop para proyectos de BigData
- API RESTfull sobre http para consulta, indexación, administración en diferentes lenguajes
- Permite múltiples índices en un cluster, así como alias de índices
- Permite consultas sobre uno o varios índices
- Full Text Search o búsqueda por texto completo
- Indexa todos los campos de los documentos JSON (sin esquema rígido)
- Búsquedas mediante ElasticSearch Query DSL (Domain Specific Language): multilenguaje, geolocalización, contextual, autocompletar, etc
Nodo
Un nodo es un servidor que forma parte del clúster, almacena los datos, y participa en las capacidades de indexación y búsqueda del cluster.
Indice
Un índice es una colección de documentos.
Tipo
Dentro de un índice, se pueden seleccionar uno o más tipos. Un tipo es una categoría / partición lógica de su índice de cuya semántica es totalmente suya. En general, un tipo se define para documentos con un conjunto de campos comunes.
Documento
Un documento es una unidad básica de información que puede ser indexado. Este documento se expresa en JSON (JavaScript Object Notation), que es un formato de intercambio de datos de Internet ubicua.
Shard y réplicas
Un índice puede almacenar una gran cantidad de datos que puede exceder los límites de hardware de un solo nodo.
Para resolver este problema, Elasticsearch ofrece la posibilidad de subdividir el índice en varios trozos llamados fragmentos. Cuando se crea un índice, sólo tiene que definir el número de fragmentos que desee. Cada fragmento es en sí mismo un “índice” totalmente funcional e independiente que se puede alojar en cualquier nodo del clúster.
Sharding es importante por dos razones principales:
- Permite dividir horizontalmente / o reducir el volumen de contenido.
- Permite distribuir y paralelizar las operaciones a través de fragmentos (potencialmente en varios nodos) aumentando así el rendimiento.
La replicación es importante por dos razones principales:
- Proporciona alta disponibilidad en caso de que falle un fragmento/nodo. Por esta razón, es importante tener en cuenta que un fragmento de réplica no se asigna en el mismo nodo que el fragmento primario/original que fue copiado.
- Se le permite escalar volumen de búsquedas y / rendimiento puesto que las búsquedas se pueden ejecutar en todas las réplicas en paralelo.
Requisitos
cd /opt/ wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz" tar xzf jdk-8u144-linux-x64.tar.gz cd /opt/jdk1.8.0_144/ alternatives --install /usr/bin/java java /opt/jdk1.8.0_144/bin/java 2
Instalación
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.noarch.rpm rpm -ivh elasticsearch-1.7.3.noarch.rpm systemctl enable elasticsearch.service systemctl start elasticsearch.service
Uso
curl -XGET http://localhost:9200/
Obtenemos la siguiente respuesta:
{ "status" : 200, "name" : "Diamanda Nero", "cluster_name" : "elasticsearch", "version" : { "number" : "1.7.3", "build_hash" : "05d4530971ef0ea46d0f4fa6ee64dbc8df659682", "build_timestamp" : "2015-10-15T09:14:17Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" }
Crear documento (CREATE)
curl -X POST 'http://localhost:9200/blog/entrada/1' -d '{ "message": "Primera entrada" }'
blog: es el índice de los datos de Elasticsearch.
entrada: es el tipo.
1: es el id de nuestra entrada bajo el índice y tipo anterior.
Obtenemos la siguiente respuesta
{ "_index":"blog", "_type":"entrada", "_id":"1", "_version":1, "created":true }
Obtener documento por ID (SELECT)
curl -X GET 'http://localhost:9200/blog/entrada/1'
y obtenemos el siguiente resultado.
{ "_index":"blog", "_type":"entrada", "_id":"1", "_version":1, "created":true }
En caso realizar la consulta para un id que no existe, se mostrara el siguiente json
{ "_index":"blog", "_type":"entrada", "_id":"2", "found":false }
Para visualizar la colección completa
curl -X GET 'http://localhost:9200/blog/_search?pretty=true&q=*:*'
y obtenemos el siguiente resultado.
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 3, "max_score" : 1.0, "hits" : [ { "_index" : "blog", "_type" : "entrada", "_id" : "1", "_score" : 1.0, "_source":{ "message": "Primera entrada!" } }, { "_index" : "blog", "_type" : "entrada", "_id" : "2", "_score" : 1.0, "_source":{ "message": "Segunda entrada!" } }, { "_index" : "blog", "_type" : "entrada", "_id" : "3", "_score" : 1.0, "_source":{ "message": "Tercera entrada!" } } ] } }
Actualizar documento(UPDATE)
curl -X POST 'localhost:9200/blog/entrada/1/_update?' -d' { "doc": { "message": "Primera entrada... actualizada" } }'
Borrar documento por ID (DELETE)
curl -X DELETE 'http://localhost:9200/blog/entrada/3'
Mas información en este enlace