Um Elasticsearch Tutorial: Primeiros Passos

#Nota: Elastic anunciou recentemente que implementaria o licenciamento de código fechado para novas versões do Elasticsearch e Kibana além da versão 7.9. Para mais detalhes, leia os comentários do nosso CEO Tomer Levy sobre o Verdadeiramente Duplicando no Código Aberto.

Elasticsearch é o coração vivo do que é hoje a plataforma de análise logística mais popular – o ELK Stack (Elasticsearch, Logstash e Kibana). O papel do Elasticsearch é tão central que se tornou sinônimo do nome da pilha em si. Primariamente para pesquisa e análise de log, Elasticsearch é hoje um dos mais populares sistemas de banco de dados disponíveis atualmente. Este tutorial Elasticsearch fornece aos novos usuários o conhecimento pré-requisito e ferramentas para começar a usar o Elasticsearch. Ele inclui instruções de instalação, indexação inicial e instruções de manuseio de dados.

O que é o Elasticsearch?

Lançado a princípio em 2010, Elasticsearch (às vezes chamado de ES) é um moderno mecanismo de busca e análise que é baseado no Apache Lucene. Completamente de código aberto e construído com Java, Elasticsearch é uma base de dados NoSQL. Isso significa que ele armazena dados de uma forma não estruturada e que você não pode usar SQL para consultá-los.

Este tutorial do Elasticsearch também pode ser considerado um tutorial do NoSQL. Entretanto, ao contrário da maioria dos bancos de dados NoSQL, o Elasticsearch tem um forte foco nas capacidades e características de busca – tanto que, na verdade, a maneira mais fácil de obter dados do ES é procurar por ele usando a extensa API do Elasticsearch.

No contexto da análise de dados, Elasticsearch é usado juntamente com os outros componentes da pilha ELK, Logstash e Kibana, e desempenha o papel de indexação e armazenamento de dados.

Installing Elasticsearch

Os requisitos para Elasticsearch são simples: Java 8 (versão específica recomendada: Oracle JDK versão 1.8.0_131). Dê uma olhada neste tutorial Logstash para garantir que você está configurado. Além disso, você vai querer ter certeza de que seu sistema operacional está na matriz de suporte do Elastic, caso contrário você pode enfrentar problemas estranhos e imprevisíveis. Uma vez feito isso, você pode começar instalando Elasticsearch.

Você pode baixar o Elasticsearch como uma distribuição autônoma ou instalá-lo usando os repositórios apt e yum. Nós instalaremos Elasticsearch em uma máquina Ubuntu 16.04 rodando em AWS EC2 usando apt.

Primeiro, você precisa adicionar a chave de assinatura do Elastic para que você possa verificar o pacote baixado (pule este passo se você já instalou pacotes do Elastic):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Para o Debian, precisamos então instalar o apt-transport-https pacote:

sudo apt-get install apt-transport-https

O próximo passo é adicionar a definição do repositório ao seu sistema:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Tudo o que falta fazer é atualizar seus repositórios e instalar o Elasticsearch:

sudo apt-get updatesudo apt-get install elasticsearch

Configurando o Elasticsearch

As configurações do Elasticsearch são feitas usando um arquivo de configuração cuja localização depende do seu sistema operacional. Neste arquivo, você pode configurar configurações gerais (por exemplo, nome do nó), bem como configurações de rede (por exemplo, host e porta), onde os dados são armazenados, memória, arquivos de log e mais.

Para fins de desenvolvimento e teste, as configurações padrão serão suficientes, mas é recomendado que você faça alguma pesquisa sobre quais configurações você deve definir manualmente antes de entrar em produção.

Por exemplo, e especialmente se instalar o Elasticsearch na nuvem, é uma boa prática ligar o Elasticsearch a um IP privado ou localhost:

sudo vim /etc/elasticsearch/elasticsearch.ymlnetwork.host: "localhost"http.port:9200

Executar o Elasticsearch

Elasticsearch não será executado automaticamente após a instalação e você precisará iniciá-lo manualmente. A forma como você executa o Elasticsearch vai depender do seu sistema específico. Na maioria dos sistemas baseados em Linux e Unix você pode usar este comando:

sudo service elasticsearch start

E é isso! Para confirmar que tudo está funcionando bem, simplesmente aponte curl ou seu navegador para http://localhost:9200, e você deve ver algo como a seguinte saída:

{ "name" : "33QdmXw", "cluster_name" : "elasticsearch", "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ", "version" : { "number" : "6.1.2", "build_hash" : "5b1fea5", "build_date" : "2018-01-10T02:35:59.208Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}

Para depurar o processo de execução do Elasticsearch, use os arquivos de log do Elasticsearch localizados (no Deb) em /var/log/elasticsearch/.

Criar um índice do Elasticsearch

Indexar é o processo de adição de dados ao Elasticsearch. Isto é porque quando você alimenta dados no Elasticsearch, os dados são colocados nos índices do Apache Lucene. Isto faz sentido porque a Elasticsearch usa os índices de Lucene para armazenar e recuperar seus dados. Embora você não precise saber muito sobre Lucene, ajuda saber como ele funciona quando você começa a ficar sério com Elasticsearch.
Elasticsearch se comporta como uma API REST, então você pode usar o método POST ou PUT para adicionar dados a ele. Você usa PUT quando você sabe ou quer especificar o id do item de dados, ou POST se você quiser que Elasticsearch gere um id para o item de dados:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{ "timestamp": "2018-01-24 12:34:56", "message": "User logged in", "user_id": 4, "admin": false}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{ "id": 4, "username": "john", "last_login": "2018-01-25 12:34:56"}'

E a resposta:

{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

Os dados para o documento são enviados como um objeto JSON. Você pode estar se perguntando como podemos indexar dados sem definir a estrutura dos dados. Bem, com Elasticsearch, como com qualquer outra base de dados NoSQL, não há necessidade de definir a estrutura dos dados de antemão. Para garantir uma performance ótima, no entanto, você pode definir os mapeamentos do Elasticsearch de acordo com os tipos de dados. Mais sobre isso mais tarde.

Se você estiver usando qualquer um dos expedidores Beats (por exemplo, Filebeat ou Metricbeat), ou Logstash, essas partes do ELK Stack irão criar automaticamente os índices.

Para ver uma lista dos seus índices Elasticsearch, use:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mbyellow open app GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kbyellow open .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kbyellow open logs T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

A lista neste caso inclui os índices que criamos acima, um índice Kibana e um índice criado por um pipeline Logstash.

Elasticsearch Querying

Após você indexar seus dados no Elasticsearch, você pode começar a procurar e analisar os mesmos. A consulta mais simples que você pode fazer é ir buscar um único item. Leia nosso artigo focado exclusivamente em consultas Elasticsearch.

Once novamente, via Elasticsearch REST API, usamos GET:

curl -XGET 'localhost:9200/app/users/4?pretty'

E a resposta:

{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 1, "found" : true, "_source" : { "id" : 4, "username" : "john", "last_login" : "2018-01-25 12:34:56" }}

Os campos que começam com um sublinhado são todos meta campos do resultado. O objeto _source é o documento original que foi indexado.
Também usamos GET para fazer buscas chamando o objeto _search endpoint:

curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":}}

O resultado contém um número de campos extras que descrevem tanto a busca quanto o resultado. Aqui está um resumo rápido:

  • took: O tempo em milissegundos a pesquisa levou
  • timed_out: If the search timed out
  • _shards: O número de fragmentos de Lucene pesquisados, e suas taxas de sucesso e fracasso
  • hits: Os resultados reais, juntamente com meta informação para os resultados

A pesquisa que fizemos acima é conhecida como uma Pesquisa URI, e é a forma mais simples de consultar Elasticsearch. Ao fornecer apenas uma palavra, ES irá pesquisar todos os campos de todos os documentos para essa palavra. Você pode construir pesquisas mais específicas usando Lucene queries:

  • username:johnb – Procura documentos onde o campo username é igual a “johnb”
  • john* – Procura documentos que contêm termos que começam com john e são seguidos por zero ou mais caracteres como “john,” “johnb,” e “johnson”
  • john? – Procura documentos que contenham termos que começam com john e são seguidos por apenas um caractere. Combina “johnb” e “johns” mas não “john”

Existem muitas outras formas de pesquisa, incluindo o uso de lógica booleana, o reforço de termos, o uso de pesquisas difusas e de proximidade e o uso de expressões regulares.

Elasticsearch Query DSL

URI searches são apenas o começo. Elasticsearch também fornece uma busca de corpo de pedido com uma Query DSL para buscas mais avançadas. Há uma grande variedade de opções disponíveis nestes tipos de buscas, e você pode misturar e combinar diferentes opções para obter os resultados que você precisa.

Contém dois tipos de cláusulas: 1) cláusulas de consulta de folha que procuram por um valor em um campo específico, e 2) cláusulas de consulta composta (que podem conter uma ou várias cláusulas de consulta de folha).

Elasticsearch Query Types

Existe uma grande variedade de opções disponíveis nestes tipos de buscas, e você pode misturar e combinar diferentes opções para obter os resultados que você precisa. Os tipos de consulta incluem:

  1. Perguntas Geográficas,
  2. Perguntas “mais parecidas”
  3. Perguntas escritas
  4. Perguntas com texto completo
  5. Perguntas sobre a forma
  6. Perguntas sobre a forma
  7. Perguntas a nível de tempo
  8. Perguntas especializadas

As de Elasticsearch 6.8, o ELK Stack fundiu as consultas Elasticsearch e os filtros Elasticsearch, mas o ES ainda as diferencia pelo contexto. A DSL distingue entre um contexto de filtro e um contexto de consulta para cláusulas de consulta. Cláusulas em um contexto de filtro testam documentos de uma forma booleana: O documento corresponde ao filtro, “sim” ou “não”? Os filtros também são geralmente mais rápidos do que as consultas, mas as consultas também podem calcular uma pontuação de relevância de acordo com o grau de aproximação entre um documento e a consulta. Os filtros não utilizam uma pontuação de relevância. Isto determina a ordenação e inclusão de documentos:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{ "query": { "match_phrase": { "message": "User logged in" } }}'

E o resultado:

{ "took" : 28, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : }}'

Criar um cluster de pesquisa elástica

Manter um cluster de pesquisa elástica pode ser demorado, especialmente se você estiver fazendo DIY ELK. Mas, dada a poderosa capacidade de busca e análise da Elasticsearch, tais clusters são indispensáveis. Temos um mergulho mais profundo no assunto com nosso tutorial Elasticsearch cluster, então usaremos isso como um trampolim para aquela caminhada mais completa.

O que é um cluster Elasticsearch, precisamente? Elasticsearch clusters agrupam múltiplos nós e/ou instâncias de Elasticsearch juntos. É claro, você sempre pode escolher manter uma única instância ou nó de Elasticsearch dentro de um dado cluster. O ponto principal de tal agrupamento reside na distribuição de tarefas, pesquisa e indexação do cluster através de seus nós. As opções de nós incluem nós de dados, nós mestre, nós clientes e nós de ingestão.

Instalar nós pode envolver muitas configurações, o que nosso tutorial acima cobre. Mas aqui está a instalação básica do nó de cluster Elasticsearch:

Primeiro e acima, instale Java:

sudo apt-get install default-jre

Próximo, adicione a chave de login do Elasticsearch:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Next, instale a nova iteração do Elasticsearch:

sudo apt-get update && apt-get install elasticsearch

Terá de criar e/ou configurar cada nó do Elasticsearch elasticsearch.yml ficheiro de configuração (sudo vim /etc/elasticsearch/elasticsearch.yml). A partir daí, inicie a Elasticsearch e então verifique o status do seu cluster de Elasticsearch. As respostas serão parecidas com isto:

{ "cluster_name" : "elasticsearch-cluster-demo", "compressed_size_in_bytes" : 255, "version" : 7, "state_uuid" : "50m3ranD0m54a531D", "master_node" : "IwEK2o1-Ss6mtx50MripkA", "blocks" : { }, "nodes" : { "m4-aw350m3-n0D3" : { "name" : "es-node-1", "ephemeral_id" : "x50m33F3mr--A11DnuM83r", "transport_address" : "172.31.50.123:9200", "attributes" : { } }, },}

Elasticsearch cluster health será o próximo na sua lista. Periodicamente verifique o estado do seu cluster com a seguinte API call:

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

Este exemplo mostra o parâmetro local como false, (que na verdade é por padrão). Isto lhe mostrará o status do nó mestre. Para verificar o nó local, mude para true.

O parâmetro nível irá, por padrão, mostrar a saúde do cluster, mas as classificações além disso incluem indices e shards (como no exemplo acima).

Há parâmetros opcionais adicionais para timeouts…

timeout
master_timeout

…ou, para esperar que certos eventos ocorram:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Remover dados da Elasticsearch

Deletar itens da Elasticsearch é tão fácil quanto inserir dados na Elasticsearch. O método HTTP a ser usado desta vez é – surpresa – DELETE:

$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}

Para apagar um índice, use:

$ curl -XDELETE 'localhost:9200/logs?pretty'

Para apagar todos os índices (use com extremo cuidado) use:

$ curl -XDELETE 'localhost:9200/_all?pretty'$

A resposta em ambos os casos deve ser:

{ "acknowledged" : true}

Para apagar um único documento:

$ curl -XDELETE 'localhost:9200/index/type/document'

O que vem a seguir?

Este tutorial ajuda os iniciantes com Elasticsearch e como tal fornece apenas os passos básicos das operações de CRUD em Elasticsearch. Elasticsearch é um mecanismo de busca, e como tal apresenta uma imensa profundidade para suas características de busca.
Versões recentes introduziram algumas incríveis novas características do Elasticsearch e também algumas mudanças significativas na estrutura de dados subjacentes.

É sempre uma boa idéia explorar a documentação oficial do Elasticsearch, bem como nosso tutorial Logstash e o tutorial Kibana.

Deixe uma resposta

O seu endereço de email não será publicado.