# Elasticsearch

Elasticsearch es un servidor de búsqueda basado en Lucene. Provee un motor de búsqueda de texto completo, distribuido y con capacidad de multitenencia con una interfaz web RESTful y con documentos JSON. Elasticsearch está desarrollado en Java y está publicado como código abierto bajo las condiciones de la licencia Apache.

## Historia

Shay Banon creó Compass en 2004. Mientras pensaba en la tercera versión de Compass, llegó a la conclusión de que habría que reescribir grandes partes de su código para “crear una solución de búsqueda escalable”. Entonces creó “una solución construida para ser distribuida desde el comienzo” con la interfaz JSON sobre HTTP, muy común y adecuada para lenguajes de programación que no sean Java. Shay Banon liberó la primera versión en febrero de 2010.
En junio de 2014, la compañía anunció la recaudación de US $70 millones en una ronda de financiación Serie C, tan sólo pasando 18 meses de la creación de la misma. La ronda fue liderada por New Enterprise Associates (NEA), además de otros como Benchmark Capital e Index Ventures. Esta ronda obtuvo una financiación total de US $104 millones.
| Versión | Fecha original de liberación | Última versión | Fecha de liberación | Mantenimiento |
| Versión antigua, sin servicio técnico: 0.4 | 2010-02-08 | 0.4.0 | 2010-02-08 | No soportado |
| Versión antigua, sin servicio técnico: 0.5 | 2010-03-05 | 0.5.1 | 2010-03-09 | No soportado |
| Versión antigua, sin servicio técnico: 0.6 | 2010-04-09 | 0.6.0 | 2010-04-09 | No soportado |
| Versión antigua, sin servicio técnico: 0.7 | 2010-05-14 | 0.7.1 | 2010-05-17 | No soportado |
| Versión antigua, sin servicio técnico: 0.8 | 2010-05-27 | 0.8.0 | 2010-05-27 | No soportado |
| Versión antigua, sin servicio técnico: 0.9 | 2010-07-26 | 0.9.0 | 2010-07-26 | No soportado |
| Versión antigua, sin servicio técnico: 0.10 | 2010-08-27 | 0.10.0 | 2010-08-27 | No soportado |
| Versión antigua, sin servicio técnico: 0.11 | 2010-09-29 | 0.11.0 | 2010-09-29 | No soportado |
| Versión antigua, sin servicio técnico: 0.12 | 2010-10-18 | 0.12.1 | 2010-10-27 | No soportado |
| Versión antigua, sin servicio técnico: 0.13 | 2010-11-18 | 0.13.1 | 2010-12-03 | No soportado |
| Versión antigua, sin servicio técnico: 0.14 | 2010-12-27 | 0.14.4 | 2011-01-31 | No soportado |
| Versión antigua, sin servicio técnico: 0.15 | 2011-02-18 | 0.15.2 | 2011-03-07 | No soportado |
| Versión antigua, sin servicio técnico: 0.16 | 2011-04-23 | 0.16.5 | 2011-07-26 | No soportado |
| Versión antigua, sin servicio técnico: 0.17 | 2011-07-19 | 0.17.10 | 2011-11-16 | No soportado |
| Versión antigua, sin servicio técnico: 0.18 | 2011-10-26 | 0.18.7 | 2012-01-10 | No soportado |
| Versión antigua, sin servicio técnico: 0.19 | 2012-03-01 | 0.19.12 | 2012-12-04 | No soportado |
| Versión antigua, sin servicio técnico: 0.20 | 2012-12-07 | 0.20.6 | 2013-03-25 | No soportado |
| Versión antigua, sin servicio técnico: 0.90 | 2013-04-29 | 0.90.13 | 2014-03-25 | No soportado |
| Versión antigua, sin servicio técnico: 1.0 | 2014-02-12 | 1.0.3 | 2014-04-16 | No soportado |
| Versión antigua, sin servicio técnico: 1.1 | 2014-03-25 | 1.1.2 | 2014-05-22 | No soportado |
| Versión antigua, sin servicio técnico: 1.2 | 2014-05-22 | 1.2.4 | 2014-08-13 | No soportado |
| Versión antigua, sin servicio técnico: 1.3 | 2014-07-23 | 1.3.9 | 2015-02-19 | No soportado |
| Versión antigua, sin servicio técnico: 1.4 | 2014-11-05 | 1.4.5 | 2015-04-27 | No soportado |
| Versión antigua, sin servicio técnico: 1.5 | 2015-03-23 | 1.5.2 | 2015-04-27 | No soportado |
| Versión antigua, sin servicio técnico: 1.6 | 2015-06-09 | 1.6.2 | 2015-07-29 | No soportado |
| Versión antigua, sin servicio técnico: 1.7 | 2015-07-16 | 1.7.5 | 2016-02-02 | No soportado |
| Versión antigua, sin servicio técnico: 2.0 | 2015-10-28 | 2.0.2 | 2015-12-17 | No soportado |
| Versión antigua, sin servicio técnico: 2.1 | 2015-11-24 | 2.1.2 | 2016-02-02 | No soportado |
| Versión antigua, con servicio técnico: 2.2 | 2016-02-02 | 2.2.2 | 2016-03-30 | Soportado |
| Versión antigua, con servicio técnico: 2.3 | 2016-03-30 | 2.3.3 | 2016-05-18 | Soportado |
| Versión estable actual: 2.4 | 2016-04-31 | 2.4.5 | 2017-04-27 | Soportado |
| Versión antigua, con servicio técnico: 5.0 | 2016-09-26 | 5.0.2 | 2016-11-29 | Soportado |
| Versión antigua, con servicio técnico: 5.1 | 2016-12-08 | 5.1.2 | 2017-01-12 | Soportado |
| Versión antigua, con servicio técnico: 5.2 | 2017-01-31 | 5.2.2 | 2017-02-28 | Soportado |
| Versión antigua, con servicio técnico: 5.3 | 2017-03-28 | 5.3.3 | 2017-06-01 | Soportado |
| Versión estable actual: 5.4 | 2017-05-04 | 5.4.3 | 2017-06-27 | Soportado |
| Leyenda:Versión antiguaVersión antigua, con soporte técnicoÚltima versiónÚltima versión previaLanzamiento futuro |||||
Para más información ingresar a https://www.elastic.co/support/eol.

## Queries

Elasticsearch utiliza Query DSL (Lenguaje de dominio específico) para realizar las consultas a los documentos indexados. Es un lenguaje sumamente flexible y de gran alcance, además de simple, que permite conocer y explorar los datos de la mejor manera. Al ser utilizado a través de una interfaz de tipo JSON, las consultas son muy sencillas de leer y, lo más importante, de depurar.
Sobre la base de su estructura y componentes, las consultas se componen de dos cláusulas: "Leaf Query Clauses" y "Compound Query Clauses". La primera hace referencia a aquellas consultas que tienen operaciones como "match", "term" o "range", que devuelven un valor específico solicitado. Las segundas se podría decir que son una combinación de la primera, una manera de realizar consultas "conjuntas" para obtener información más compleja y detallada.

### Tipos de consultas

Una consulta comienza con la palabra "query" seguida de unas condiciones y filtros dentro, en la forma de un objeto JSON. Existen distintos tipo de consultas que podemos identificar, por ejemplo:

#### Match all query

La consulta más básica que se puede hacer. Devuelve todos los objetos que se encuentren indexados:

#### Match query

Este tipo de consulta se utiliza para realizar una búsqueda donde se busca igualar determinados valores de un término o una frase. Entonces, si buscamos, por ejemplo dentro de nuestra base de datos, todos los objetos cuyo atributo color es verde, tomaría la siguiente forma:

#### Multi match query

Muy similar a la consulta descrita anteriormente, pero en lugar de buscar la coincidencia con un valor solo, chequea con varios campos:

#### Term queries

Este tipo de consultas se utilizan cuando se trabaja con datos como números o fechas, para buscar el valor de un término concreto:

#### Range query

Otro tipo de consultas son aquellas que buscan por el rango de determinado atributo. Se utilizan distintos operadores ("gte": mayor o igual a determinado valor, "gt": mayor a determinado valor, "lte": menor o igual , "lt": menor):
Estos son algunos de los ejemplos de consulta que se pueden utilizar. Son muchas más las opciones, los operadores y los filtros que se pueden usar; sobre todo si se empieza a combinar los mismos.

## Ventajas

Se podrían enumerar varias ventajas que brinda esta herramienta. Algunas de las más destacables son las siguientes:
* Al estar desarrollado en Java, es compatible en todas las plataformas donde Java lo sea.
* Tiene una gran velocidad de respuesta.
* Es distribuido, lo que lo hace fácilmente escalable y adaptable a las distintas situaciones.
* Simple realización de respaldos de los datos almacenados.
* Utiliza objetos JSON como respuesta, por lo que es fácil de invocar desde varios lenguajes de programación.

## Desventajas

Como todo, ElasticSearch posee algunas desventajas:
* Sólo soporta como tipos de respuesta JSON, lo que lo limita al no soportar otros lenguajes, como CSV o XML.
* Algunas situaciones pueden generar casos de split-brain.

## Resumen

Elasticsearch puede ser usado para buscar todo tipo de documentos. La búsqueda es escalable y casi en tiempo real, soportando tenencia múltiple. “Es distribuido, haciendo que los índices se puedan dividir en fragmentos y cada uno teniendo cero o más réplicas. Cada nodo alberga uno o más fragmentos, actuando como un coordinador para delegar operaciones a los fragmentos correctos. El rebalanceo y ruteo se realizan automáticamente […]”.
Utiliza Lucene e intenta hacer todas sus funciones disponibles a través de JSON y Java API. Soporta facetado y percolación, que puede ser útil para notificar si nuevos documentos coinciden con consultas registradas.
Otra funcionalidad llamada "gateway" maneja la persistencia a largo plazo del índice; por ejemplo, se puede recuperar un índice del gateway en caso de una caída del servidor. Soporta peticiones GET en tiempo real y esto lo hace válido para una solución NoSQL, pero carece de transacciones distribuidas.

## Usuarios destacados

La lista de usuarios destacados de Elasticsearch incluye a Wikimedia, StumbleUpon, Mozilla, Quora, Foursquare, Etsy, SoundCloud, GitHub, FDA, CERN, BuscaMil y Stack Exchange. También es el corazón del proyecto europeo de centralización de memorias de traducción para administraciones públicas europeas NEC-TM liderado por Pangeanic dentro del programa "Connectar Europa".

## Interacción con otras herramientas de software

Elasticsearch forma parte de los sistemas de gestión de eventos e información de seguridad, específicamente en la Plataforma ELK (siglas de ElasticSearch-LogStash-Kibana). Elasticsearch también acepta de manera nativa otras herramientas de visualización y exploración, pudiéndose utilizar Grafana y/o Kibana para tales propósitos.