API de busca inteligente usando FastAPI + Typesense para e-commerce eletrônicos.
# Rodar Typesense via Docker
docker run -d --name typesense-server \
-p 8108:8108 \
-v/tmp/typesense-data:/data \
typesense/typesense:29.0 \
--data-dir /data --api-key=xyz --enable-cors
# Verificar se está rodando
curl http://localhost:8108/health# Instalar dependências com UV
uv add fastapi uvicorn typesense python-multipart pydantic-settings# Iniciar API de busca
uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000# Carregar dados de exemplo (20 produtos eletrônicos)
uv run python data/setup_data.py| Endpoint | Método | Descrição |
|---|---|---|
/ |
GET | Informações da API |
/health |
GET | Status da API e Typesense |
/docs |
GET | Documentação Swagger |
/api/v1/search |
GET | Busca produtos |
/api/v1/autocomplete |
GET | Sugestões |
/api/v1/index |
POST | Indexar produto |
/api/v1/documents/{id} |
DELETE | Remover produto |
curl "http://localhost:8000/api/v1/search?q=iphone"curl "http://localhost:8000/api/v1/search?q=smartphone&categoria=smartphones&marca=Apple&preco_max=8000&sort=preco"curl "http://localhost:8000/api/v1/autocomplete?q=sam"curl -X POST "http://localhost:8000/api/v1/index" \
-H "Content-Type: application/json" \
-d '{
"nome": "Galaxy S24 Ultra",
"descricao": "Smartphone Samsung top de linha",
"preco": 6999.99,
"categoria": "smartphones",
"marca": "Samsung",
"avaliacao": 4.7,
"estoque": 10,
"tags": ["android", "premium", "camera"]
}'┌─────────────────┐ GET /search?q=termo ┌─────────────────┐ Typesense API ┌─────────────────┐
│ Cliente │ ─────────────────────────► │ search-tool │ ──────────────────► │ Typesense │
│ (Frontend) │ │ FastAPI │ │ Search Engine │
│ │ ◄───── JSON Results ────── │ (Port 8000) │ ◄──── Results ──── │ (Port 8108) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
search-tool/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI app principal
│ ├── models.py # Schemas Pydantic
│ ├── typesense_client.py # Cliente Typesense
│ ├── config.py # Configurações
│ └── routes/
│ ├── __init__.py
│ └── search.py # Rotas de busca
├── data/
│ ├── produtos_eletronicos.json # Dataset exemplo
│ └── setup_data.py # Script população
├── pyproject.toml # Dependências UV
├── README.md
└── PLANO_ACAO.md # Documentação desenvolvimento
- ✅ Busca textual - Por nome, descrição, marca e tags
- ✅ Filtros avançados - Categoria, marca, faixa de preço
- ✅ Ordenação - Por preço, avaliação, relevância
- ✅ Autocompletar - Sugestões em tempo real
- ✅ Paginação - Limit e offset
- ✅ CRUD dinâmico - Indexar/remover produtos
- ✅ Health check - Monitoramento de status
- ✅ Documentação - Swagger UI automática
- ✅ Tratamento de erros - Respostas padronizadas
- ✅ Logs estruturados - Para debugging
# 1. Health check
curl http://localhost:8000/health
# 2. Busca básica
curl "http://localhost:8000/api/v1/search?q=iphone"
# 3. Busca avançada
curl "http://localhost:8000/api/v1/search?q=notebook&categoria=notebooks&preco_max=10000&sort=preco"
# 4. Autocompletar
curl "http://localhost:8000/api/v1/autocomplete?q=mac"
# 5. Documentação
open http://localhost:8000/docs20 produtos eletrônicos com:
- Smartphones: iPhone, Galaxy, Pixel
- Notebooks: MacBook, Dell XPS, Legion
- Fones: AirPods, Sony, Bose
- Tablets: iPad Pro, Galaxy Tab
Configurações via variáveis de ambiente ou .env:
# Typesense
TYPESENSE_HOST=localhost
TYPESENSE_PORT=8108
TYPESENSE_API_KEY=xyz
# API
API_HOST=0.0.0.0
API_PORT=8000
DEBUG=false- Busca: < 100ms para datasets até 10k produtos
- Autocompletar: < 50ms
- Indexação: ~10ms por documento
- Memory: ~50MB (API) + ~100MB (Typesense)
# Build da API
docker build -t search-tool .
# Run completo com docker-compose
docker-compose up -d- Configure Typesense Cloud ou servidor dedicado
- Ajuste variáveis de ambiente
- Use reverse proxy (nginx)
- Configure monitoramento
- Fork o projeto
- Crie branch para feature (
git checkout -b feature/nova-feature) - Commit changes (
git commit -am 'Add nova feature') - Push branch (
git push origin feature/nova-feature) - Abra Pull Request
MIT License - veja arquivo LICENSE para detalhes.
Feito com ❤️ usando FastAPI + Typesense