Elasticsearch na Pratica: Busca Full-Text e Analise Distribuida com ELK Stack

O que e o Elasticsearch?
O Elasticsearch e um motor de busca e analise distribuido, open-source, construido sobre o Apache Lucene. Ele permite armazenar, pesquisar e analisar grandes volumes de dados em tempo real, com respostas tipicamente em milissegundos.
Parte do Elastic Stack (ELK — Elasticsearch, Logstash, Kibana), o Elasticsearch e a escolha padrao para busca full-text, analise de logs, monitoramento de infraestrutura, observabilidade e aplicacoes de e-commerce que exigem busca relevante e facetada.
Conceitos Fundamentais
- Indice (Index): Colecao de documentos com caracteristicas semelhantes, equivalente a uma tabela em bancos relacionais.
- Documento: Unidade basica de informacao, armazenada em JSON.
- Mapeamento (Mapping): Esquema que define como os campos sao indexados e armazenados.
- Shard: Unidade de trabalho que contem um subconjunto dos dados de um indice.
- Replica: Copia de um shard primario, usada para alta disponibilidade.
- No (Node): Instancia do Elasticsearch em execucao.
- Cluster: Conjunto de nos que processam dados de forma distribuida.
Arquitetura Distribuida
O Elasticsearch foi projetado desde o inicio para escala horizontal. Quando voce cria um indice, ele e dividido em shards. Cada shard e um indice Lucene completo, distribuido entre os nos do cluster:
# Cluster com 3 nos e indice com 5 shards + 2 replicas
Node A → Shard 0 (P), Shard 1 (R), Shard 3 (R)
Node B → Shard 1 (P), Shard 2 (R), Shard 4 (R)
Node C → Shard 2 (P), Shard 3 (P), Shard 4 (P), Shard 0 (R)Se um no falha, os shards primarios que estavam nele sao promovidos a partir das replicas em outros nos, garantindo disponibilidade continua.
Indexacao e Consultas
A indexacao no Elasticsearch transforma textos brutos em estruturas pesquisaveis usando analise lexical (tokenizacao, stemming, filtros).
Criando um Indice com Mapeamento
PUT /produtos
{
"mappings": {
"properties": {
"nome": { "type": "text", "analyzer": "standard" },
"preco": { "type": "float" },
"categoria": { "type": "keyword" }
}
}
}Inserindo Documentos
POST /produtos/_doc/1
{
"nome": "Notebook Gamer Ultra",
"preco": 7499.90,
"categoria": "eletronicos"
}Buscas Full-Text com Query DSL
GET /produtos/_search
{
"query": {
"bool": {
"must": [{ "match": { "nome": "notebook gamer" } }],
"filter": [{ "range": { "preco": { "gte": 3000 } } }]
}
},
"sort": [{ "preco": "asc" }],
"aggs": {
"por_categoria": {
"terms": { "field": "categoria" }
}
}
}Agregacoes: Analise em Tempo Real
As agregacoes sao o equivalente ao GROUP BY do SQL, permitindo criar dashboards e relatorios em tempo real:
GET /vendas/_search
{
"size": 0,
"query": { "range": { "data": { "gte": "2026-01-01" } } },
"aggs": {
"vendas_por_mes": {
"date_histogram": {
"field": "data",
"calendar_interval": "month"
},
"aggs": {
"total": { "sum": { "field": "valor" } },
"top_produtos": {
"terms": { "field": "produto", "size": 5 }
}
}
}
}
}Principais tipos: Bucket (terms, range, date_histogram), Metric (sum, avg, min, max) e Pipeline (derivative, moving_avg).
Elasticsearch com Python
from elasticsearch import Elasticsearch
# Conectar ao cluster
es = Elasticsearch(["http://localhost:9200"])
# Indexar um documento
doc = {
"titulo": "Introducao ao Elasticsearch",
"conteudo": "Guia completo sobre busca e analise distribuida...",
"tags": ["elasticsearch", "busca", "python"],
"data": "2026-05-28"
}
resp = es.index(index="artigos", id=1, document=doc)
print(f"Indexado: {resp['result']}")
# Buscar documentos
resp = es.search(
index="artigos",
query={"match": { "conteudo": "busca distribuida" }},
size=10
)
for hit in resp["hits"]["hits"]:
print(f'Score: {hit["_score"]:.2f} | {hit["_source"]["titulo"]}')
# Agregacao
resp = es.search(
index="artigos",
aggs={"por_tag": {"terms": {"field": "tags", "size": 10}}}
)
for bucket in resp["aggregations"]["por_tag"]["buckets"]:
print(f'{bucket["key"]}: {bucket["doc_count"]} artigos')Ecossistema Elastic Stack
- Kibana: Interface grafica para dashboards, exploracao de logs e gerenciamento do cluster.
- Logstash: Pipeline de processamento que ingere, transforma e envia dados.
- Beats: Agentes leves (Filebeat, Metricbeat, Heartbeat) para coleta de dados.
- Elastic APM: Monitoramento de performance de aplicacoes com tracing distribuido.
- Elasticsearch SQL: Consultas em SQL tradicional sobre dados no Elasticsearch.
Casos de Uso Reais
- Busca em E-commerce: Milhoes de produtos com autocomplete, correcao ortografica e relevância.
- Centralizacao de Logs: Agregar logs de centenas de microsservicos para troubleshooting.
- Observabilidade (APM): Rastreamento distribuido de requisicoes e metricas de performance.
- Analise de Seguranca (SIEM): Correlacao de eventos de seguranca em tempo real.
- Busca Geoespacial: Consultas de proximidade geografica com filtros por categorias.
Boas Praticas em Producao
- Mapeamento Explicito: Defina mappings manualmente para evitar tipos inesperados.
- Indices por Data: Use ILM (Index Lifecycle Management) para gerenciar retencao e backup.
- Shards Adequados: Cada shard entre 10GB e 50GB e o ponto ideal.
- Refresh Interval: Ajuste para 30s em cenarios de escrita intensiva.
- Monitoramento: Acompanhe JVM heap, search rate e indexing rate com o Kibana.
- Seguranca: Habilite autenticacao, TLS e RBAC em producao.
Conclusao
O Elasticsearch transformou a forma como lidamos com busca e analise de dados em escala. Com sua API REST elegante, arquitetura distribuida e ecossistema completo, ele e a ferramenta certa para qualquer cenario que exija respostas rapidas sobre grandes volumes de dados.
Comece baixando o Elasticsearch e o Kibana, suba um cluster de desenvolvimento com Docker Compose, indexe seus primeiros documentos e explore o poder das consultas full-text e agregacoes.







