Elasticsearch: conceitos iniciais

Dhyogo Almeida
Fretebras Tech
Published in
4 min readFeb 27, 2021

Com a quantidade de dados que são gerados atualmente, nasce a necessidade de um mecanismo que consiga suprir a carga de trabalho para buscas e análise dos dados. E para isso, é com muito prazer que te apresento o Elasticsearch.

O que é Elasticsearch?

Elasticsearch é um mecanismo de busca e análise de dados gratuito e aberto. Suporta vários tipos de dados, sendo eles textuais, numéricos, geoespaciais, estruturados e não estruturados.

Características

Conta com um sistema distribuído e escalável de forma horizontal. Mas o que quer dizer escalável de forma horizontal? Significa que se você precisa de mais poder de processamento, não aumente memória ou processador, apenas crie mais nós!

Suporta requisições em JSON e retorna dados em JSON, tornando ele uma ferramenta de alta compatibilidade com as diversas linguagens de programação. É baseado em uma interface REST, ou seja, com simples requisições HTTP é possível interagir com o Elasticsearch.

Finalidades

É utilizado para diversos fins, entre eles:

  • busca em aplicações e sites;
  • logging e análise de logs;
  • métricas
  • etc…

Comparativo com um Banco de Dados Relacional (RDBMS)

Para fins de exemplo, se pudéssemos comparar o Elasticsearch com um banco de dados relacional, chegaríamos a seguinte conclusão:

  • Um banco de dados em um RDBMS seria um cluster no Elasticsearch;
  • Uma tabela em um RDBMS equivale a um índice no Elasticsearch;
  • Uma linha de uma tabela em um RDBMS equivale a um documento no Elasticsearch.

Índice invertido

O Elasticsearch usa uma estrutura de dados chamada de índice invertido, que é projetada para permitir buscas de texto completo muito rápidas. Um índice invertido lista cada palavra exclusiva que apareça em qualquer documento e identifica todos os documentos em que cada palavra aparece.

Quando cito índice invertido, me lembro de outro conceito do Elasticsearch chamado de relevância. Quando você faz uma busca, você espera encontrar resultados que façam mais sentido para o que você procura. Baseado no Term Frequency (frequência com que uma palavra aparece em um documento) e o Document Frequency (frequência com que um termo aparece em todos os documentos), temos a relevância dos resultados da busca.

Mapping

O mapping diz ao Elasticsearch como os dados devem ser armazenados, que tipo de dado é, como indexar e como analisar. Como citado anteriormente, vamos interagir com o Elasticsearch utilizando chamadas HTTP no padrão REST. Assumindo que você já tenha o Elasticsearch instalado e em execução, no exemplo abaixo temos um mapping, onde definimos que a propriedade origin_location será do tipo geo_point, ou seja, é passível de busca utilizando coordenadas lat/long:

curl -H "Content-type: application/json" -X PUT 127.0.0.1:9200/cities -d '
{
"mappings" : {
"properties" : {
"origin_location:" : {
"type" : "geo_point"
}
}
}
}'

Os mappings mais comuns são relacionados aos field types: string, byte, short, integer, long, float, double, boolean, date.

Exemplo de um mapping:

curl -H "Content-type: application/json" -X PUT 127.0.0.1:9200/cities -d '
{
"mappings" : {
"properties" : {
"city_id:" : {
"type" : "long"
}
}
}
}'

Existem também mapping para escolher o tipo de indexação de um campo, como por exemplo, um campo indexado para full-text search. Como estamos falando dos conceitos iniciais, não abordaremos este tipo de indexação mais avançada nesse momento.

Inserindo um documento no Elasticsearch

Para inserir dados, continuamos fazendo as chamadas HTTP, mas dessa vez vamos utilizar o verbo POST e informar o tipo de documento padrão _doc do Elasticsearch:

curl -H "Content-type: application/json" -X POST localhost:9200/cities/_doc -d '{
"city" : "São Paulo",
"origin_location" : "-23.55000000,-46.64000000"
}'

Simples, não é?

Buscando um documento

Seguindo a abordagem REST, utilizamos o verbo GET em nossa requisição HTTP. Informamos também ao Elasticsearch que estamos querendo fazer uma busca adicionando logo após o nome do índice o comando _search. No corpo devemos informar que estamos fazendo uma query que corresponda (match) aos parâmetros que passarmos no JSON. A nossa busca ficaria assim:

curl -H "Content-type: application/json" -X GET localhost:9200/cities/_search -d '{
"query" : {
"match" : {
"city" : "São Paulo"
}
}
}'

Atualizando um documento

Para atualizar, alteramos o verbo da requisição para PUT, informamos logo após o índice o tipo de documento padrão _doc e após o _doc passamos o ID do documento que queremos atualizar, ficando da seguinte forma:

curl -H "Content-type: application/json" -X PUT localhost:9200/cities/_doc/JF7m5HcB05-PSinO_l1X/ -d '{
"city" : "São Paulo SP"
}'

Uma curiosidade sobre atualização de documentos

Documento são imutáveis. Todo documento possui uma propriedade chamada _version. Quando atualizamos um documento, um novo é criado e sua versão é incrementada, e o documento antigo é marcado para exclusão.

Apagando um documento

Já inserimos, buscamos e atualizamos um documento, mas como excluir? Seguindo a mesma abordagem simples já citada anteriormente. Usamos o verbo DELETE na requisição HTTP, informamos logo após o índice o tipo de documento padrão _doc e após o _doc passamos o ID do documento que queremos excluir:

curl -H "Content-type: application/json" -X DELETE localhost:9200/cities/_doc/JF7m5HcB05-PSinO_l1X

Quer continuar aprendendo? Você pode utilizar a mesma fonte de informações que utilizei neste artigo acessando https://www.elastic.co/guide/index.html.

Espero que este artigo te ajude no início do seu aprendizado sobre o Elasticsearch!

--

--