52 lines
1.7 KiB
Markdown
52 lines
1.7 KiB
Markdown
# 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
|
|
```
|