Accede a todo EDteam con un único pago¡Sube a premium!

Introducción a Elasticsearch

Elasticsearch resuelve problemas comunes a la hora de crear buscadores. En este artículo te enseñare todos los conceptos que necesitas saber para trabajar con este motor.

Diseño web
8 minutos
Hace 4 años
Introducción a Elasticsearch

Todos los días usamos buscadores como Google, pero ¿es fácil hacer un buscador?, ¿es buena idea hacer uno desde cero, o es mejor usar alguna herramienta que nos facilite el proceso?, en este blog les hablare sobre elasticsearch el cual nos facilitara la creación de un buscador.

¿Que es Elasticsearch?

Elasticsearch es un motor de búsqueda y analizador de datos basado en Lucene la cual es una librería desarrollada en Java que nos permite implementar funcionalidades de búsqueda.

Elasticsearch nos resuelve problemas comunes de los buscadores, como dar sugerencias mientras el usuario va escribiendo, o dar las sugerencias por orden de relevancia y no en un orden aleatorio, y lo más importante: la velocidad para obtener los resultados.

Nadie quiere esperar tanto tiempo para obtener unos cuantos resultados.

Características

  • Open source
  • Distribuido
  • Escalable
  • Desarrollado en Java
  • Expone una API para poder consumirlo

Conceptos importantes

Para empezar a conocer mejor a Elasticsearch hay unos conceptos que debemos tener claros:

  • Nodos Un nodo es una instancia en ejecución de elasticsearch, aquí es donde nuestra información se guarda, y donde las búsquedas se realizan, podemos ver un nodo como un Postgresql, MySQL, SQL Server, etc.
  • Clusters Es una colección de uno o muchos nodos que están comunicados, esto nos permite tener distribuida nuestra información y tener la capacidad de buscar a través de todos los nodos.
  • Documentos Un documento es una unidad de información en formato JSON, lo podríamos ver como una fila en una base de datos relacional.
  • Indices Son una colección de documentos, seria una tabla en una base de datos relacional.
  • Shards Nos permite fragmentar nuestro índice, por ejemplo: si tenemos un índice que ocupa demasiado espacio en disco, con los shards lo podríamos fragmentar y almacenar en otros nodos para distribuir la información. Los shards se comportan como un índice independiente.
  • Replicas Son copias de nuestros indices, nos dan alta disponibilidad por si se nos cae un nodo y ayudan bastante a la hora de la búsqueda ya que elasticsearch tiene la capacidad de buscar paralelamente a través de las réplicas.

Instalación

  1. Descarga elasticsearch desde este link y corre el ejecutable elasticsearch que se encuentra en {carpeta-de-instalacion}/elasticsearch-{version}/bin/

  2. Cuando se haya completado la instalación, haz una petición a http://localhost:9200

  3. Si todo funcionó bien, recibiras una respuesta como esta:

     {
     	"name": "twddsad",
     	"cluster_name": "elasticsearch",
     	"cluster_uuid": "35Hbpi8sRGufkpZkL4W6PA",
     	"version": {
     			"number": "7.3.2",
     			"build_flavor": "default",
     			"build_type": "tar",
     			"build_hash": "1c1faf1",
     			"build_date": "2019-09-06T14:40:30.409026Z",
     			"build_snapshot": false,
     			"lucene_version": "8.1.0",
     			"minimum_wire_compatibility_version": "6.8.0",
     			"minimum_index_compatibility_version": "6.0.0-beta1"
     	},
     	"tagline": "You Know, for Search"
     }
    

Comandos

Ahora veremos los comandos disponibles para manipular la información:

PUT

Nos permite crear o actualizar un documento en elasticsearch

PUT users/_doc/2
{
  "name": "Hernan",
  "age": 20
}

Respuesta

{
  "_index" : "users",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

En la petición usamos el endpoint users/_doc/2 , donde:

  • users: es el nombre del indice donde se guardara el documento
  • _doc: el tipo de documento
  • 2: el id del documento

si el indice no existe, se crea, al igual que el documento

Get

Nos permite obtener la información:

GET users/_doc/2

respuesta

{
  "_index" : "users",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "Hernan",
    "age" : 20
  }
}

Delete

Para borrar un documento solo tenemos que usar el siguiente comando:

DELETE users/_doc/2

respuesta

{
  "_index" : "users",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 3,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 1
}

Buscando informacion con queries mas complejas

Ahora haremos búsquedas con Body Query Request

  • multi_match busca entre un conjunto de campos

      GET users/_search
      {
        "query": {
          "multi_match": {
            "query": "hernan",
            "fields": ["name"]
          }
        }
      }
    

    respuesta

      {
        "took" : 1,
        "timed_out" : false,
        "_shards" : {
          "total" : 1,
          "successful" : 1,
          "skipped" : 0,
          "failed" : 0
        },
        "hits" : {
          "total" : {
            "value" : 1,
            "relation" : "eq"
          },
          "max_score" : 0.2876821,
          "hits" : [
            {
              "_index" : "users",
              "_type" : "_doc",
              "_id" : "2",
              "_score" : 0.2876821,
              "_source" : {
                "name" : "Hernan",
                "age" : 20
              }
            }
          ]
        }
      }
    
  • match busca en un campo

      GET users/_search
      {
        "query": {
          "match": {
            "name": "hernan"
          }
        }
      }
    

    respuesta

      {
        "took" : 0,
        "timed_out" : false,
        "_shards" : {
          "total" : 1,
          "successful" : 1,
          "skipped" : 0,
          "failed" : 0
        },
        "hits" : {
          "total" : {
            "value" : 1,
            "relation" : "eq"
          },
          "max_score" : 0.2876821,
          "hits" : [
            {
              "_index" : "users",
              "_type" : "_doc",
              "_id" : "2",
              "_score" : 0.2876821,
              "_source" : {
                "name" : "Hernan",
                "age" : 20
              }
            }
          ]
        }
      }
    
  • query_string busca entre todos los campos

      GET users/_search
      {
        "query": {
          "query_string": { 
            "query": "hernan"
          }
        }
      }
    

    respuesta

      {
        "took" : 1,
        "timed_out" : false,
        "_shards" : {
          "total" : 1,
          "successful" : 1,
          "skipped" : 0,
          "failed" : 0
        },
        "hits" : {
          "total" : {
            "value" : 1,
            "relation" : "eq"
          },
          "max_score" : 0.2876821,
          "hits" : [
            {
              "_index" : "users",
              "_type" : "_doc",
              "_id" : "2",
              "_score" : 0.2876821,
              "_source" : {
                "name" : "Hernan",
                "age" : 20
              }
            }
          ]
        }
      }
    

Esta ha sido una pequeña introducción a elasticsearch, solo vimos por encima los conceptos y consultas de elasticsearch, en un próximo post estaremos profundizando más en las consultas y tocando temas avanzados como los mappings, analizadores de texto e indices invertidos.

Nos vemos en la próxima.

Comentarios de los usuarios

Pregunta a ChatEDT