🤖 Motor de Búsqueda de Emails

🤖 Motor de Búsqueda de Emails

- 6 mins

Contexto

Motor de búsqueda full-text que indexa y permite buscar en el histórico completo del dataset público Enron (517,424 correos electrónicos).

Implementa búsqueda de alta performance con resaltado de coincidencias, indexación concurrente optimizada, y frontend responsive moderno.

🔗 Demo en vivo: https://frontend.juliandeveloper.dev


Stack Técnico

Backend:

Frontend:

Infraestructura:


Arquitectura del Sistema

Arquitectura de 3 Capas

┌─────────────┐     ┌─────────────┐     ┌──────────────┐
│   Frontend  │─────▶│   API Go    │─────▶│  ZincSearch  │
│    Vue 3    │◀─────│  (Backend)  │◀─────│  (Search DB) │
└─────────────┘     └─────────────┘     └──────────────┘
     (SPA)          (REST /search)      (Full-text index)

Componentes del Sistema

  1. Indexer (Go): Herramienta CLI que procesa 517K correos y los indexa en ZincSearch
  2. API Backend (Go): Servidor REST que expone endpoint de búsqueda
  3. Frontend (Vue 3): SPA que consume la API y presenta resultados
  4. ZincSearch: Motor de búsqueda ligero con índices invertidos

Funcionalidades Principales

1. Indexación Masiva Concurrente

Indexer CLI en Go que procesa el dataset completo de Enron:

Métricas:

2. Búsqueda Full-Text con Highlight

Endpoint POST /search:

// Request:
{
  "searchTerm": "energy trading"
}

// Response:
{
  "emails": [
    {
      "id": "...",
      "from": "jeff.skilling@enron.com",
      "to": "kenneth.lay@enron.com",
      "subject": "Q4 Energy Trading Results",
      "date": "2001-12-05",
      "content": "...",
      "highlight": "Summary of <strong>energy trading</strong> performance..."
    }
  ]
}

Features técnicas:

3. Frontend Moderno y Responsive

SPA Vue 3 con Composition API:

4. Profiling y Optimización

Herramientas de análisis de rendimiento:

go tool pprof cpu.prof    # Análisis de uso de CPU
go tool pprof mem.prof    # Análisis de memoria

Highlights Técnicos

Concurrencia con Goroutines

Procesamiento paralelo de archivos usando goroutines:

var wg sync.WaitGroup
filepath.Walk("./maildir", func(path string, info os.FileInfo, err error) error {
    wg.Add(1)
    go func() {
        defer wg.Done()
        processFile(path)  // Procesa en paralelo
    }()
    return nil
})
wg.Wait()  // Espera a que todos terminen

Ventajas:

Batching para Eficiencia de Red

Agrupa registros antes de enviar a ZincSearch:

Búsqueda Optimizada con ZincSearch

ZincSearch es un motor de búsqueda ligero (alternativa a Elasticsearch):

Clean Architecture en Go

Separación clara de responsabilidades:

server/
├── main.go          # Entry point
├── controllers/     # HTTP handlers (routes, search)
├── models/          # Data layer (emails)
└── utils/           # Helpers (JSON writer)

Desafíos Técnicos Resueltos

  1. Parsing de Emails Corruptos: Dataset Enron contiene headers malformados que rompen el parser estándar net/mail. Solución: Regex de limpieza previa (cleanMalformedHeaders())

  2. Race Conditions en Concurrencia: Múltiples goroutines escribiendo al mismo slice. Solución: sync.Mutex para sincronización segura

  3. Optimización de Memoria: Indexación de 517K correos consumía GB de RAM. Solución: Procesamiento por lotes + liberación explícita de memoria

  4. CORS para SPA: Frontend en dominio diferente al backend. Solución: Middleware CORS de Chi con configuración permisiva en desarrollo

  5. Highlight de Resultados: Resaltar términos buscados en el contenido. Solución: Configuración de ZincSearch query con parámetros de highlight (<strong> tags)


Infraestructura y DevOps

Docker Compose Multi-Servicio

Orquestación de 3 servicios:

services:
  zincsearch:    # Motor de búsqueda (puerto 4080)
  backend:       # API Go (puerto 8080)
  frontend:      # Vue 3 SPA (puerto 5173 dev / 80 prod)

Volúmenes persistentes:

Despliegue en AWS EC2

Configuración de producción:

Script de Descarga Automática

download_data.sh descarga el dataset completo de Enron:

./indexer/download_data.sh  # Descarga y descomprime 517K correos

Impacto y Métricas

Métrica Valor
Dataset procesado 517,424 correos electrónicos del caso Enron
Performance Búsquedas full-text en <100ms (promedio)
Frontend moderno SPA con HMR en <50ms (Vite)
Profiling completo CPU y memoria analizados con pprof
Producción Desplegado en AWS con HTTPS y alta disponibilidad

Repositorio

🔗 GitHub: https://github.com/andresprogramacion123/emails_zincsearch

Julián Montoya

Julián Montoya

Backend Developer especializado en Python, AWS y Machine Learning