# enrich_fulltext_v1.2 **Verze:** 1.2 **Datum:** 2026-06-03 **Skript:** `enrich_fulltext_v1.2.py` ## Změna proti v1.1 Velký XLSX (`#400 MDD3003_EAT detail report_30jun25.xlsx`, 5 242 128 znaků textu) způsobil pád: ``` psycopg.errors.ProgramLimitExceeded: string is too long for tsvector (1114090 bytes, max 1048575 bytes) ``` PostgreSQL `tsvector` má **tvrdý limit ~1 MB** binární velikosti — nelze obejít. **Řešení:** `tsv` se generuje z prvních **800 000 znaků** sloupce `body`: ```sql tsv tsvector GENERATED ALWAYS AS ( to_tsvector('soubory'::regconfig, left(coalesce(body, ''), 800000)) ) STORED ``` - sloupec `body` zůstává **plný** (až 5 MB) — pro náhledy, snippet, `ts_headline` - vyhledávání (`tsv @@ q`) ignoruje obsah za 800 000. znakem - u rozsáhlých XLSX/PDF (např. data exporty) je 800 KB stále víc než 100 000 slov — pro fulltext bohatě stačí ## Migrace `SCHEMA_SQL` při startu zkontroluje, zda současný výraz `tsv` obsahuje `left(`. Pokud ne (starý sloupec z v1.0/v1.1): 1. dropne `documents_tsv_gin` index 2. dropne sloupec `tsv` 3. přidá nový s `left(body, 800000)` 4. index se vytvoří znovu na konci `SCHEMA_SQL` Bezpečné spustit opakovaně. ## extractor_version Posunuto na `1.2` → všechny řádky z v1.0/v1.1 se přeparsují (potřebné už proto, že migrace tsv změnila co je v indexu). ## Vše ostatní Beze změny proti [v1.1](Trash/enrich_fulltext_v1.1.md): - DOCX fallback přes raw `word/document.xml` - NUL byte strip - Limity souborů (PDF 500 MB, XLSX 200 MB, ostatní 300 MB), text max 5 MB - Inkrementálně podle `sha256` + `extractor_version` ## Spuštění ``` python U:\PythonProject\Janssen\Soubory\enrich_fulltext_v1.2.py ```