80 lines
3.6 KiB
Markdown
80 lines
3.6 KiB
Markdown
# 5_enrich_fulltext_emails_v1.3.py
|
|
|
|
**Krok 5 pipeline** — vytáhne plain-text z emailů v Mongu (`emaily.<schránka>`) a uloží do PostgreSQL (`MongoEmaily.emails`) s tsvector GIN indexem nad konfigurací `soubory` (simple + unaccent).
|
|
|
|
## Co dělá
|
|
|
|
1. Vybere první dostupné tělo v tomto pořadí:
|
|
- `smime_body_text/html` (rozbaleno krokem 4)
|
|
- `body_html` → strip HTML přes BeautifulSoup
|
|
- `body_text` (legacy plain)
|
|
- `body_preview` (jako fallback)
|
|
2. Naplní řádek v PG `emails` (mailbox, subject, sender, recipients, body, attachments_summary, ...) + tsvector se vygeneruje sám.
|
|
3. Upsert (`ON CONFLICT (mailbox, message_id) DO UPDATE`).
|
|
|
|
## Inkrementální logika
|
|
|
|
Pokud `(mailbox, message_id)` už je v PG a:
|
|
- `extractor_version == EXTRACTOR_VERSION` (aktuálně `1.2`)
|
|
- `ok = true`
|
|
- `modified_at` v Mongo není novější než v PG
|
|
|
|
→ **skip**. Nemusíš se bát opakovaného spuštění — vladimirovo přepsání 73k záznamů co teď probíhá je proto, že `EXTRACTOR_VERSION` byl povýšen z 1.1 → 1.2, takže všechny řádky v PG jsou „zastaralé". Po doběhnutí bude další běh skipovat všechno až na nově přibyvší.
|
|
|
|
## Změny v1.3 vs v1.2
|
|
|
|
- **Bugfix** `NON_MAILBOX_COLLECTIONS = {"attachments_index", "sync_state"}` — předtím `sync_state` (přibyla s delta syncem) projížděla jako mailbox.
|
|
- **`--index-reset`** — před zpracováním schránky `DELETE FROM emails WHERE mailbox=%s`. Force re-extract bez nutnosti povyšovat verzi.
|
|
- **Vylepšený per-mailbox header** — ukáže `v Mongu N, v PG M (uptodate K), k zpracovani K`.
|
|
- Když `to_process_estimate == 0` → schránku přeskočí úplně (bez iterace cursorem).
|
|
|
|
## Argumenty
|
|
|
|
| Argument | Povinný | Hodnoty | Default | Popis |
|
|
|---|---|---|---|---|
|
|
| `--mailbox` | ne | e-mail | (všechny) | Bez argumentu projede všechny kolekce mimo `NON_MAILBOX_COLLECTIONS` |
|
|
| `--limit N` | ne | int | (bez limitu) | Per schránka, jen prvních N emailů (test) |
|
|
| `--index-reset` | ne | flag | false | Před zpracováním **smaže** všechny emaily dané schránky v PG. **Bez `--mailbox` smaže CELÝ index!** |
|
|
|
|
## Varianty volání
|
|
|
|
```bash
|
|
# Všechny schránky, inkrementální:
|
|
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py
|
|
|
|
# Jedna schránka:
|
|
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz
|
|
|
|
# Test 500 emailů:
|
|
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --limit 500
|
|
|
|
# Force reindex jedné schránky:
|
|
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --mailbox ordinace@buzalkova.cz --index-reset
|
|
|
|
# DANGEROUS: smaže celý index a postaví znovu (POMALÉ — typicky 30+ minut):
|
|
docker exec -it python-runner python /scripts/5_enrich_fulltext_emails_v1.3.py --index-reset
|
|
|
|
# Na pozadí, log do souboru:
|
|
docker exec -d python-runner bash -c "python /scripts/5_enrich_fulltext_emails_v1.3.py > /scripts/enrich_fulltext.log 2>&1"
|
|
```
|
|
|
|
## Sledování průběhu
|
|
|
|
```bash
|
|
docker exec -it python-runner tail -f /scripts/enrich_fulltext.log
|
|
```
|
|
|
|
V průběhu skript vypisuje každých 200 zpracovaných emailů:
|
|
```
|
|
[ 38800|p= 5800] OK html 2831ch | CLEAR/RA payment information for invoice #22FV049
|
|
```
|
|
- první číslo = pozice v cursoru (počet všech emailů co prošlo)
|
|
- `p=N` = počet skutečně zprocesovaných (zbytek byl skipnut jako už-aktuální)
|
|
- `OK / ERR`, `body_source`, délka, subject
|
|
|
|
## Závislosti
|
|
|
|
```bash
|
|
docker exec python-runner pip install psycopg[binary] beautifulsoup4 lxml pymongo
|
|
```
|