Elasticsearch, descobrindo!
Tags: programming, python, tutorial, devops
Published: 2022-05-09 12:26:36

Prontos para mais um diário de bordo? Hoje iremos decorrer sobre [Elasticsearch](https://www.elastic.co/pt/elasticsearch/), o que é, como é utilizado, por que utilizar e em qual momento deve ser utilizado e alguns exemplos práticos no final. O Elasticsearch é um mecanismo de busca e análise de dados, voltado para grandes volumes de dados.

## O que é ElasticSearch

![O que é ElasticSearch](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/onbhdnh6bynhi42j0zxt.png)

Segundo o site oficial do [Elastic](https://www.elastic.co/pt/what-is/elasticsearch) "O Elasticsearch é um mecanismo de busca e análise de dados distribuído, gratuito e aberto para todos os tipos de dados, incluindo textuais, numéricos, geoespaciais, estruturados e não estruturados."

A forma de armazenamento que ele utiliza para textos é a estrutura de [**índice invertido**](https://acervolima.com/indice-invertido/), buscando uma palavra que seja única em todos os documentos que você tem salvo no elastic, quando ele já tem isso obtido, quando é realizado uma busca, ele retorna todos os documentos que tem aquela palavra única em todos os documentos que você passou. Entretanto campos numéricos e geográficos são armazenados em [**árvore BKD**](https://stringfixer.com/pt/K-D-B-tree) e campos de textos em [**índice invertido**](https://acervolima.com/indice-invertido/) como relatei a cima.

Segundo [Stringfixer](https://stringfixer.com/pt/K-D-B-tree) "uma **árvore KDB** ( árvore B k- dimensional ) é uma estrutura de dados em árvore para subdividir um espaço de busca k- dimensional. O objetivo da árvore KDB é fornecer a eficiência de pesquisa de uma árvore kd balanceada , enquanto fornece o armazenamento orientado a blocos de uma árvore B para otimizar os acessos à memória externa."

A extração de dados, como ele faz é um de seus diferenciais, através do [RestAPI](https://jobmigration.blogspot.com/2022/05/interface-de-programacao-de-aplicacoes.html?m=1) conseguindo realizar de forma simples e rápido. Sua API suporta [**Queries Estruturadas**](https://www.treinaweb.com.br/blog/o-que-e-sql#:~:text=SQL%20ou%20Structured%20Query%20Language,Firebird%2C%20MySQL%2C%20entre%20outros.), [**Full Text Queries**](https://www.redspark.io/mongodb-entendendo-full-text-search/) e **Queries Complexas**. As consultas são criadas usando **Query DSL(Domain Specific Language)** uma linguagem de consulta baseada em json, temos que pensar em uma Query DSL em uma **AST(Abstract Syntax Tree)**. Trarei logo abaixo o que é Query DSL e AST, um resumo de ambos.

## Para que o Elasticsearch é usado?

Devido à velocidade, performance, escalabilidade, facilidade e integração com outras ferramentas que o elastic possui, ele pode ser usado para:

- Busca em aplicação
- Busca em website
- Busca empresarial
- Logging e analítica de log
- Métricas de infraestrutura e monitoramento de container
- APM (Monitoramento de performance de aplicação)
- Análise e visualização de dados geoespaciais
- Analítica de segurança
- Análise de dados empresarial

## O que é Query DSL?

![O que é Query DSL?](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/778t54o47gdpbivodfz0.jpg)

O Querydsl é um framework java que permite gerar queries type-safe com sintaxe similar ao JPQL, SQL e outras suportadas.


## O que é AST?

Segundo [Twilio](https://www.twilio.com/blog/abstract-syntax-trees) "Abstract Syntax Trees ou ASTs são representações em árvore do código. Eles são uma parte fundamental da maneira como um compilador funciona. Quando um compilador transforma algum código, existem fundamentalmente os seguintes passos:"

- Análise Lexical - conhecida como Tokenização
- Análise de sintaxe - Conhecida como analise
- Geração de código


![O que é AST?](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvdp30h3s7svow0iqi0c.png)

## Quais linguagens de programação têm suporte no Elasticsearch?

O Elasticsearch oferece suporte a uma variedade de linguagens, que são:

- Java
- JavaScript (Node.js)
- Go
- .NET (C#)
- PHP
- Perl
- Python
- Ruby

## Hora da prática

Como ele fornece uma API Rest, com isso recebe requisição HTTP, utilizando os quatros verbos GET, POST, PUT e DELETE

```
1| endereco_da_api:porta/indice/tipo_do_documento
2| example- http://localhost:9200/futebol/jogador
```

### Uma requisição POST para uri

Realiza a indexação de um documento cujos dados devem ser passados como um objeto JSON no corpo da requisição, exemplo:

```python
POST http://localhost:9200/futebol/jogador
{
    "nome": "Édson Arantes do Nascimento",
    "apelido": "Pelé",
    "titulos_mundiais": [
        "1958",
        "1962",
        "1970"
    ]
}
```

### Uma requisição GET para uri/_search

Retorna todos os documentos do índice indicado, exemplo:

```python
GET http://localhost:9200/futebol/jogador/_search
{
    "query": {
        "match": {
            "apelido": {
            "query": "Pelé"
            }
        }
    }
}
```

### Uma requisição PUT para uri/_id

_id deve ser o valor do código de identificação do documento. Caso o _id seja de um documento existente, substitui os campos do documento pelo corpo JSON da requisição. 

### Uma requisição DELETE para uri/_id

_id deve ser o valor do código de identificação do documento. Caso o _id seja de um documento existente, deleta fisicamente o documento do índice em que ele está indexado.


## Conclusão

Então, como podemos ver o Elastic search é muito bom, ele é um assunto bem interessante, a forma de uso, as funcionalidades, performance que ele possui, pode te ajudar em diversas situações que esteja passando. Gostaria de ter o conhecido antes, recomendo muito ele.

## TODO

* O ElasticSearch seria útil para você?
* Já passou por problemas de volume de dados grandes?
* Conhece outra ferramenta melhor que essa?
* Aplicam esta ferramenta no seu trabalho? Porquê?

Respondam às perguntas nos comentários.

Este foi o <b>diário de bordo #16</b>. Hoje eu escolhi falar sobre o **Elasticsearch** na próxima semana irei trazer sobre **Redis** galera, vlw. Vamos nos despedindo por aqui. Voltaremos com mais um diário de bordo.

<p align="center">
  <a href="#">
    <img src="https://cdn.dribbble.com/users/1889486/screenshots/5081642/thankyou_.gif" width="500">
  </a>
</p>

<b>Este artigo foi útil para você?</b> 
<b>Deixe um comentário abaixo.</b>

## Referências 

* [Site oficial do Elastic](https://www.elastic.co/pt/elasticsearch/)
* [Documentação do Elastic](https://www.elastic.co/pt/what-is/elasticsearch)
* [Exemplo em Python](https://www.elastic.co/guide/en/elasticsearch/client/python-api/master/examples.html)
* [O que é Elastic](https://www.devmedia.com.br/o-que-e-elasticsearch/40207)
* [O que é RestAPI](https://jobmigration.blogspot.com/2022/05/interface-de-programacao-de-aplicacoes.html?m=1)
* [O que é Arvore BKD](https://stringfixer.com/pt/K-D-B-tree)
* [O que é Indice Invertido](https://acervolima.com/indice-invertido/)