# enrich_fulltext_v1.0 **Verze:** 1.0 **Datum:** 2026-06-03 **Skript:** `enrich_fulltext_v1.0.py` ## Účel Pro každý dokument odkazovaný v MongoDB (`soubory.*`) vytáhne **plný text** a uloží do PostgreSQL s GIN `tsvector` indexem pro fulltext vyhledávání. ## Cíl: PostgreSQL `MongoSoubory` - **host:** 192.168.1.76:5432 - **db:** `MongoSoubory` - **user:** vladimir.buzalka - **extension:** `unaccent`, `pg_trgm` - **text search config:** `soubory` (= simple + unaccent → case- a diakritika-insensitivní) ## Tabulka `documents` | sloupec | typ | popis | |---|---|---| | id | BIGSERIAL | PK | | mongo_id | TEXT | ObjectId z Mongo | | study | TEXT | kolekce v Mongo (`42847922MDD3003` / `77242113UCO3001`) | | path | TEXT | absolutní cesta (UNIQUE s study) | | rel_path, name, ext | TEXT | doplňková metadata | | sha256 | TEXT | pro inkrementální kontrolu | | size_bytes, mtime | | | | **body** | TEXT | plný extrahovaný text (max 5 MB) | | body_length | INT | délka v znacích | | **tsv** | tsvector GENERATED STORED | `to_tsvector('soubory', body)` | | extracted_at | TIMESTAMPTZ | čas extrakce | | extractor_version | TEXT | verze tohoto skriptu | | ok | BOOLEAN | true pokud extrakce proběhla | | error | TEXT | chybové hlášení | **Indexy:** GIN nad `tsv`, GIN trigram nad `name`, btree `sha256`, btree `(study, ext)`. ## Podporované přípony `pdf`, `docx`, `xlsx`, `xlsm`, `pptx`, `eml`, `msg`, `txt`, `csv` ## Inkrementální chování Soubor se přeskočí pokud v PG už existuje záznam s: - shodným `sha256` - shodnou `extractor_version` - `ok = true` Jinak se přeparsuje a UPSERT. ## Limity (skip s `error=too_big_...`) - PDF nad 500 MB - XLSX nad 200 MB - ostatní nad 300 MB - `body` se vždy ořízne na 5 MB UTF-8 ## Příklady dotazů (psql) ```sql -- fulltext (case+diakritika insensitivní) SELECT study, name, ts_rank_cd(tsv, q) AS rank, ts_headline('soubory', body, q, 'MaxFragments=2,MinWords=5,MaxWords=15') AS snippet FROM documents, plainto_tsquery('soubory', 'amendment 3') q WHERE tsv @@ q ORDER BY rank DESC LIMIT 20; -- jméno obsahuje (trigram, fuzzy) SELECT study, name FROM documents WHERE name ILIKE '%protokol%'; -- nejdelsi dokumenty per studie SELECT study, name, body_length FROM documents WHERE ok = true ORDER BY body_length DESC LIMIT 10; ``` ## Spuštění ``` python U:\PythonProject\Janssen\Soubory\enrich_fulltext_v1.0.py ``` Průběh tiskne řádek na soubor: `[n/total] OK pdf 2.3MB protokol.pdf | 12340 znaku 'Protocol amendment ...'`