“Findability is a feature, not um detalhe.” — #30DiasJava DX Charter

🎯 Objetivo do Day 8

O Day 8/30 foi sobre discoverability. O desafio: entregar um Search Service que combina busca textual com similaridade semântica, servindo desde landing pages até a assistente do projeto.

🛠️ Destaques da implementação

  • Pipeline híbrido: PostgreSQL com pg_trgm para ranking textual + pgvector para semântica.
  • Indexação incremental: eventos ContentIndexedEvent alimentam o worker search-indexer, que normaliza conteúdo, gera embeddings e mantém search_index_audit.
  • API flexível: endpoint /api/search aceita filtros por tipo, liga/desliga busca semântica e devolve relevância combinada (rank textual + similaridade).
  • Quotas e segurança: JWT para consumidores internos, X-API-Key rotacionável para integrações, rate limiting em Redis e auditoria anonimizada.
  • Observabilidade: métricas (search_latency_seconds, search_semantic_usage_total, search_index_backlog), logs com traceId/queryHash e traces do pipeline completo.

💡 Lições do dia

  • Embeddings só entregam valor quando convivem com filtros estruturados — não adianta listas irrelevantes.
  • Versão de schema é fundamental: cada documento indexado traz schemaVersion para evitar incompatibilidades.
  • Backpressure importa: medir backlog de indexação evita que novos conteúdos fiquem invisíveis.

🔗 Recursos


Next episodeDay 9/30 — Payment Service, Ledgers, and Idempotent Webhooks