# 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
```
