-
Notifications
You must be signed in to change notification settings - Fork 3
11 ‐ Search
O Elastic Stack é organizado em torno de quatro soluções: Observabilidade, Segurança, Search e a infraestrutura que sustenta todas elas. Este capítulo cobre o pilar Search com foco nas funcionalidades de inteligência artificial do Elasticsearch 9.x.
A evolução da busca no Elasticsearch seguiu uma trajetória clara:
Busca por palavras-chave (BM25)
↓
Busca semântica (ELSER / sparse vectors)
↓
Busca híbrida (BM25 + semântico com RRF)
↓
RAG — Retrieval Augmented Generation (busca + LLM)
↓
Agentes de IA com acesso a ferramentas e dados
Cada camada adicionou capacidade sem substituir a anterior. Em 2026, uma implementação moderna de busca usa todas essas camadas em conjunto.
O BM25 é o algoritmo padrão do Elasticsearch desde a versão 5.x. Calcula relevância com base na frequência do termo no documento e na raridade do termo no índice. Limitação: só encontra o que está literalmente escrito. Buscar "problema de conexão" não retorna documentos que falam em "falha de rede" ou "timeout".
O ELSER (Elastic Learned Sparse EncodeR) é o modelo de busca semântica desenvolvido pela Elastic. Em vez de comparar palavras, ele expande o texto em termos associados com seus pesos de relevância:
"problema de conexão" → { "rede": 0.82, "falha": 0.71, "timeout": 0.65, "conectividade": 0.58, ... }
Vantagens:
- Não requer fine-tuning — funciona out-of-the-box em qualquer domínio
- Recomendado para documentos em inglês
- Para outros idiomas, use o modelo E5 (multilingual)
Tipo de campo introduzido no 8.15 e GA no 9.x. Você declara o campo como semantic_text, associa a um endpoint de inferência, e o Elasticsearch gera os embeddings automaticamente na indexação e executa a busca semântica quando você usa a query semantic. Zero configuração de pipeline.
Combina BM25 e busca semântica em um único resultado usando RRF (Reciprocal Rank Fusion). O RRF pondera os rankings de cada abordagem — documentos bem ranqueados em ambas as listas sobem no resultado final. Na prática, supera as duas abordagens individuais na maioria dos casos.
Arquitetura que combina busca com LLM. O sistema busca os documentos mais relevantes no Elasticsearch e os passa como contexto para o LLM gerar a resposta. Resultado: o LLM responde com base nos seus dados reais, não nos dados de treinamento — reduzindo alucinações e permitindo responder sobre dados privados ou recentes.
O Cloud Connect é o mecanismo que permite conectar um cluster self-managed aos serviços da Elastic Cloud sem migrar os dados ou alterar a arquitetura. Com ele, o cluster local passa a usar a infraestrutura de GPU da Elastic para inferência de modelos.
O EIS (Elastic Inference Service) é o serviço de inferência gerenciado pela Elastic que roda na Cloud. Ao conectar o cluster via Cloud Connect, o EIS disponibiliza automaticamente:
- Endpoints de inferência ELSER (busca semântica)
- Endpoints de embedding multilingual (E5)
- LLMs gerenciados pela Elastic — disponíveis para o AI Assistant, o Agent Builder e o Search Playground sem precisar configurar API key de provedor externo
- Reranking de resultados de busca
O que muda na prática: sem o EIS, para usar ELSER você precisaria de um node ML com 4GB+ dedicado, baixar e inicializar o modelo localmente, e gerenciar a infraestrutura de inferência. Com o EIS via Cloud Connect, nada disso é necessário — o processamento acontece na infraestrutura da Elastic e os resultados voltam para o cluster.
Requisito de licença: o EIS via Cloud Connect requer licença Enterprise no cluster self-managed. O trial de 30 dias que ativamos nos labs anteriores é suficiente. A conta na Elastic Cloud pode ser o tier gratuito — a API key gerada lá é suficiente para estabelecer a conexão.
Neste laboratório vamos criar uma conta gratuita na Elastic Cloud, gerar a Cloud Connect API key e conectar o cluster self-managed ao Elastic Inference Service.
- Acesse cloud.elastic.co
- Clique em Start free trial — não é necessário cartão de crédito
- Preencha os dados e confirme o email
- Após login, você estará no painel da Elastic Cloud
Não é necessário criar nenhum deployment na Cloud. Apenas a conta é necessária para gerar a Cloud Connect API key.
- No painel da Elastic Cloud, clique no avatar no canto superior direito
- Selecione Organization
- Clique na aba API keys
- Clique em Create API key
- Dê um nome descritivo — ex:
cloud-connect-treinamento - Clique em Create API key
- Copie e salve a key — ela é exibida apenas uma vez
O EIS via Cloud Connect requer licença Enterprise. Ative o trial de 30 dias:
POST /_license/start_trial?acknowledge=trueVerifique:
GET /_licenseO campo type deve mostrar trial.
- No Kibana local, use a barra de busca global (ícone de lupa ou
Ctrl+/) e pesquise por Cloud Connect - Clique em Cloud Connect nos resultados
- Você verá a tela exibida na imagem do lab — com os campos de Sign up / Log in e o campo para colar a API key
- Cole a Cloud Connect API key gerada no Passo 2
- Clique em Connect
O Kibana vai verificar a chave e confirmar a conexão.
Após conectar ao Cloud Connect, a tela de Cloud connected services vai mostrar os serviços disponíveis — incluindo o Elastic Inference Service.
- Clique em Connect ao lado do Elastic Inference Service
- Aguarde a configuração ser concluída — pode levar alguns segundos
Após a conexão, o Elasticsearch cria automaticamente os endpoints de inferência no cluster:
GET /_inferenceVocê verá os endpoints criados automaticamente:
-
.elser-2-elastic— busca semântica em inglês -
.multilingual-e5-small-elastic— busca semântica multilingual -
.rerank-elastic— reranking de resultados
Esses endpoints estão prontos para uso sem nenhuma configuração adicional.
Acesse Stack Management → AI → GenAI Settings (a tela da imagem 1 do lab).
Você verá que agora há um modelo conectado — o Kibana detectou os LLMs gerenciados pelo EIS e configurou os conectores automaticamente. O aviso "No Large Language Model detected" desapareceu.
A seção Documentation mostra dois pacotes disponíveis para instalar: Elastic documentation e Security labs. Instale os dois — eles alimentam o AI Assistant com documentação oficial da Elastic, tornando as respostas mais precisas para perguntas sobre o próprio Elasticsearch.
O AI Assistant é o assistente de inteligência artificial integrado ao Kibana. Ele aparece no canto superior direito da interface (ícone "AI Agent") e pode ser acessado de qualquer página do Kibana.
Responder perguntas técnicas sobre o Elastic Stack:
- "Como configuro uma ILM policy com fase warm e cold?"
- "Qual a diferença entre
textekeyword?" - "Por que meu cluster está em status yellow?"
Com a documentação oficial instalada (Passo 6 do lab anterior), as respostas são fundamentadas na documentação atual do produto — não no conhecimento de treinamento do LLM que pode estar desatualizado.
Analisar dados do cluster em contexto: O AI Assistant tem acesso às ferramentas do Elasticsearch e pode executar queries, analisar resultados e interpretar o estado do cluster diretamente durante a conversa.
Auxiliar na criação de queries e visualizações: Você pode descrever o que quer ver e o assistente sugere a query ou a configuração de visualização correspondente.
Ajudar na investigação de incidentes (Observability e Security): Quando aberto no contexto de um alerta ou de uma investigação de segurança, o assistente tem acesso ao contexto daquele evento e pode auxiliar na análise.
Ícone "AI Agent" no canto superior direito do Kibana → aparece em qualquer página
Ou via atalho de teclado: Ctrl + ; (Windows/Linux) / Cmd + ; (Mac)
Passo 1 — Abrir o AI Assistant
Clique no ícone AI Agent no canto superior direito.
Passo 2 — Fazer perguntas sobre o cluster
Tente as seguintes perguntas e observe as respostas:
Qual é o estado atual do meu cluster?
Tenho um índice chamado artigos-tecnologia. Quantos documentos ele tem?
Como posso verificar se o ILM está funcionando corretamente nos meus índices?
Passo 3 — Pedir ajuda para criar uma query
Me ajude a criar uma query que busca documentos com o campo 'nivel' igual a 'ERROR'
no índice informacoes_pessoas, ordenados por data decrescente
O assistente vai gerar a query, explicar o que ela faz, e você pode executá-la diretamente no Dev Tools.
Passo 4 — Perguntar sobre documentação
Qual é a diferença entre forcemerge e merge no Elasticsearch?
Quando devo usar o tipo de campo nested em vez de object?
Com a documentação oficial instalada, as respostas vão citar as fontes da documentação da Elastic.
Passo 5 — Pedir análise do estado do cluster
Analise os índices do meu cluster e me diga se há algo que precisa de atenção
O assistente vai consultar o cluster e retornar uma análise baseada nos dados reais.
O Agent Builder permite criar agentes de IA customizados — assistentes especializados com instruções específicas, acesso a fontes de dados determinadas e comportamento configurável. Enquanto o AI Assistant é um assistente genérico do Elastic Stack, o Agent Builder permite criar assistentes especializados para casos de uso específicos do seu negócio.
- Agente de suporte técnico: configurado para responder perguntas sobre os seus sistemas internos, com acesso aos índices de logs e documentação interna
- Agente de análise de segurança: especializado em analisar alertas do SIEM e sugerir próximos passos de investigação
- Agente de observabilidade: focado em diagnosticar problemas de performance com acesso aos dados de APM e métricas
Instructions (System Prompt): as instruções que definem o comportamento do agente. Define a personalidade, as restrições, o escopo de atuação e o formato das respostas.
Knowledge sources: os índices do Elasticsearch que o agente pode consultar para fundamentar suas respostas. O agente faz busca semântica nesses índices antes de gerar cada resposta — é RAG aplicado a um agente customizado.
Tools: as ações que o agente pode executar além de buscar documentos — executar queries, chamar APIs externas, criar casos no Security.
Passo 1 — Acessar o Agent Builder
Menu → Search → Agent Builder (ou pesquise "Agent Builder" na barra de busca global)
Passo 2 — Criar um novo agente
Clique em Create agent.
Passo 3 — Configurar as instruções
No campo Instructions, cole o seguinte system prompt:
Você é um especialista em Elasticsearch e Elastic Stack.
Seu nome é ElasticBot.
Responda sempre em português brasileiro.
Você pode:
- Explicar conceitos do Elasticsearch como mapping, shards, ILM, aggregations
- Ajudar a criar queries e configurações
- Analisar problemas de performance e sugerir soluções
- Explicar erros e como resolvê-los
Quando não tiver certeza de algo, diga claramente que não sabe
em vez de inventar uma resposta.
Seja objetivo e técnico. Cite exemplos de queries ou configurações
sempre que fizer sentido.
Passo 4 — Adicionar knowledge sources
- Em Knowledge sources, clique em Add index
- Selecione o índice
artigos-tecnologiacriado nos labs anteriores - O agente vai usar esses documentos como base de conhecimento ao responder
Passo 5 — Testar o agente
No painel de teste à direita, experimente perguntas:
O que é ELSER e quando devo usá-lo?
Tenho um índice com dados de logs que está crescendo sem controle. O que fazer?
Explique a diferença entre busca por palavras-chave e busca semântica
Observe como as respostas combinam o conhecimento do LLM com os documentos indexados — o agente vai citar informações dos artigos quando relevante.
Passo 6 — Publicar o agente
- Dê um nome ao agente — ex:
ElasticBot - Clique em Save
- O agente agora aparece como opção no AI Assistant — clique no ícone AI Agent e troque de "AI Agent" para "ElasticBot"
O Search Playground é uma interface dentro do Kibana para experimentar RAG com os seus dados. Com o EIS conectado, o Playground usa os LLMs gerenciados pela Elastic automaticamente — sem precisar configurar API key de provedor externo.
Menu → Search → Playground
Com o EIS conectado, o Playground já mostra "LLM Connected" — os modelos gerenciados pela Elastic estão disponíveis.
Passo 1 — Selecionar os dados
- No Playground, clique em Add data sources
- Selecione o índice
artigos-tecnologia - Clique em Save
Passo 2 — Fazer perguntas
Como posso diagnosticar lentidão em queries do banco de dados?
Quais são as boas práticas de segurança para APIs REST?
Observe as citações abaixo de cada resposta — o Playground mostra quais documentos foram usados para gerar a resposta.
Passo 3 — Explorar a query por baixo
- Clique em Query na barra superior
- Veja a query Elasticsearch que está sendo executada para buscar o contexto
- Experimente trocar a query de
semanticparamatche observe como as respostas mudam dependendo dos documentos recuperados
Passo 4 — Ver o código gerado
- Clique em View code
- O Kibana gera o código Python completo do pipeline RAG
- Esse código pode ser baixado como ponto de partida para uma aplicação real
Com o EIS conectado, o endpoint .elser-2-elastic está disponível. Vamos criar um índice com semantic_text e comparar resultados de busca por palavras-chave versus busca semântica.
PUT /artigos-tecnologia
{
"mappings": {
"properties": {
"titulo": { "type": "text" },
"conteudo": { "type": "text" },
"conteudo_semantico": {
"type": "semantic_text",
"inference_id": ".elser-2-elastic"
}
}
}
}POST /_bulk
{ "index": { "_index": "artigos-tecnologia", "_id": "1" } }
{ "titulo": "Problemas de conectividade em redes corporativas", "conteudo": "Falhas de rede podem ocorrer por diversos motivos: timeout de conexão, roteamento incorreto, firewall bloqueando portas, ou sobrecarga do servidor DNS. O diagnóstico começa pela verificação da camada física e sobe até a camada de aplicação.", "conteudo_semantico": "Falhas de rede podem ocorrer por diversos motivos: timeout de conexão, roteamento incorreto, firewall bloqueando portas, ou sobrecarga do servidor DNS. O diagnóstico começa pela verificação da camada física e sobe até a camada de aplicação." }
{ "index": { "_index": "artigos-tecnologia", "_id": "2" } }
{ "titulo": "Otimização de queries em bancos de dados relacionais", "conteudo": "Queries lentas em bancos de dados geralmente são causadas por falta de índices, planos de execução ineficientes, ou excesso de JOINs. O uso de EXPLAIN ANALYZE revela o custo de cada operação e indica onde otimizar.", "conteudo_semantico": "Queries lentas em bancos de dados geralmente são causadas por falta de índices, planos de execução ineficientes, ou excesso de JOINs. O uso de EXPLAIN ANALYZE revela o custo de cada operação e indica onde otimizar." }
{ "index": { "_index": "artigos-tecnologia", "_id": "3" } }
{ "titulo": "Kubernetes: escalabilidade automática de pods", "conteudo": "O Horizontal Pod Autoscaler (HPA) escala automaticamente o número de pods com base em métricas de CPU, memória ou métricas customizadas. A configuração envolve definir o número mínimo e máximo de réplicas e o threshold de utilização.", "conteudo_semantico": "O Horizontal Pod Autoscaler (HPA) escala automaticamente o número de pods com base em métricas de CPU, memória ou métricas customizadas. A configuração envolve definir o número mínimo e máximo de réplicas e o threshold de utilização." }
{ "index": { "_index": "artigos-tecnologia", "_id": "4" } }
{ "titulo": "Segurança em APIs REST: autenticação e autorização", "conteudo": "APIs REST devem implementar autenticação via tokens JWT ou OAuth 2.0. A autorização é feita verificando as permissões do token antes de executar cada operação. Ataques comuns incluem injection, broken authentication e excessive data exposure.", "conteudo_semantico": "APIs REST devem implementar autenticação via tokens JWT ou OAuth 2.0. A autorização é feita verificando as permissões do token antes de executar cada operação. Ataques comuns incluem injection, broken authentication e excessive data exposure." }
{ "index": { "_index": "artigos-tecnologia", "_id": "5" } }
{ "titulo": "Monitoramento de aplicações com métricas e alertas", "conteudo": "O monitoramento eficaz combina métricas de sistema (CPU, memória, disco) com métricas de aplicação (latência, taxa de erros, throughput). Alertas devem ser configurados com thresholds dinâmicos para evitar ruído.", "conteudo_semantico": "O monitoramento eficaz combina métricas de sistema (CPU, memória, disco) com métricas de aplicação (latência, taxa de erros, throughput). Alertas devem ser configurados com thresholds dinâmicos para evitar ruído." }Aguarde alguns segundos após indexar. O EIS processa os campos
semantic_textem background — os embeddings são gerados na infraestrutura da Elastic e armazenados no cluster local.
GET /artigos-tecnologia/_search
{
"query": {
"match": {
"conteudo": "aplicação lenta"
}
}
}Anote quais artigos retornaram e com qual score.
GET /artigos-tecnologia/_search
{
"query": {
"semantic": {
"field": "conteudo_semantico",
"query": "aplicação lenta"
}
}
}Compare com os resultados anteriores. A busca semântica deve retornar artigos sobre queries lentas de banco de dados e monitoramento — mesmo sem as palavras "aplicação lenta" estarem nesses documentos.
GET /artigos-tecnologia/_search
{
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"match": { "conteudo": "aplicação lenta" }
}
}
},
{
"standard": {
"query": {
"semantic": {
"field": "conteudo_semantico",
"query": "aplicação lenta"
}
}
}
}
],
"rank_window_size": 10,
"rank_constant": 60
}
}
}Compare os três resultados: BM25, semântico e híbrido. O RRF combina os rankings das duas abordagens.
O _reindex é a operação padrão para migrar dados entre índices — necessário sempre que você precisa mudar o mapping de um índice existente ou adicionar novas capacidades como semantic_text a dados já indexados.
POST /_reindex
{
"source": {
"index": "indice-original"
},
"dest": {
"index": "indice-novo"
}
}Acompanhar o progresso:
GET /_tasks?actions=*reindex&detailed=truePadrão de produção — migrar com alias:
POST /_aliases
{
"actions": [
{ "remove": { "index": "indice-original", "alias": "meus-dados" } },
{ "add": { "index": "indice-novo", "alias": "meus-dados" } }
]
}Qualquer aplicação que usa o alias continua funcionando sem alteração — a migração é transparente.
Permite executar buscas em múltiplos clusters a partir de um único ponto. Útil quando os dados estão distribuídos geograficamente por regulamentação ou organização.
Configuração:
PUT /_cluster/settings
{
"persistent": {
"cluster.remote.cluster-remoto.seeds": ["ip-remoto:9300"]
}
}Busca cross-cluster:
GET /cluster-remoto:indice-remoto,indice-local/_search
{
"query": { "match_all": {} }
}