# Busca Global (Search Service) V2

O Serviço de Busca Global da V2 é um motor de alta performance projetado para unificar a busca administrativa (CMS) e pública (Portal), utilizando o poder do **PostgreSQL 17**.

## 🏗️ Arquitetura (Explicit Sender Pattern)
Diferente da V1, a V2 evita o uso de "Magic Traits" ou Observers globais. O fluxo de indexação é **explícito**:

1.  **DTOs**: O dado é envelopado em um Objeto de Transferência de Dados (`CMSIndexDTO` ou `PublicSearchDTO`).
2.  **Sender**: Cada módulo possui um utilitário em `Consumer/SearchSender.php` que realiza o mapeamento e dispara o envio.
3.  **Service**: Os serviços `CMSIndexerService` e `PublicIndexerService` realizam o UPSERT no banco.

## 🚀 Otimizações PostgreSQL 17
- **Atomicidade (UPSERT)**: Uso de `INSERT ... ON CONFLICT DO UPDATE` para garantir indexação rápida sem race conditions.
- **Busca Semântica (FTS)**: Configuração de pesos por relevância (A, B, C) e suporte a sintaxe Google via `websearch_to_tsquery`.
- **Generated Columns**: O vetor de busca é mantido automaticamente pelo banco via coluna `STORED`.
- **GIN Indexes**: Índices invertidos para buscas textuais sub-segundo.

## 🛠️ Como Implementar em um Novo Módulo

1. **Crie o Sender**:
   ```php
   // app/V2/Modules/MeuModulo/Consumer/SearchSender.php
   public function sync($model) { ... }
   ```

2. **Chame explicitamente**:
   No Controller, após o `$model->save()`:
   ```php
   (new SearchSender())->sync($model);
   ```

## 📍 Localização do Código
- **Código Base**: `app/V2/Services/Search/`
- **Tabelas**: `cms_links_index`, `public_search_index`
- **Resultados CMS**: `v2.cms.search` (`/cms/search`)
- **Resultados Portal**: `v2.portal.search` (`/busca`)

---
*Documentado em Junho de 2026.*
