Files
janssen/Soubory/Trash/enrich_fulltext_v1.0.md
T

2.5 KiB

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)

-- 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 ...'