3.6 KiB
3.6 KiB
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á
- Vybere první dostupné tělo v tomto pořadí:
smime_body_text/html(rozbaleno krokem 4)body_html→ strip HTML přes BeautifulSoupbody_text(legacy plain)body_preview(jako fallback)
- Naplní řádek v PG
emails(mailbox, subject, sender, recipients, body, attachments_summary, ...) + tsvector se vygeneruje sám. - 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 = truemodified_atv 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ímsync_state(přibyla s delta syncem) projížděla jako mailbox. --index-reset— před zpracováním schránkyDELETE 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 | (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í
# 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
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
docker exec python-runner pip install psycopg[binary] beautifulsoup4 lxml pymongo