# Příklady dotazů — MCP `soubory` 10 příkladů od nejjednoduššího po nejsložitější. Každý je nejdřív stručně, pak rozepsaný. Volání je přes `search(...)`. V Claude chatu se ptáš normálně česky ("najdi mi…") a Claude pod kapotou volá `mcp__soubory__search(...)`. Tady ukazuju **přímé volání** tak, abys viděl co se kombinuje. --- ## Přehled (od nejlehčího po nejtěžší) | # | Příklad | |---|---| | 1 | `search("randomization")` | | 2 | `search("adverse event")` | | 3 | `search('"protocol deviation"')` | | 4 | `search("randomization", ext=["xlsx","xlsm"])` | | 5 | `search("SAE", study="UCO3001", ext=["eml","msg"])` | | 6 | `search('"kit number"', folder="CRF", since="2025-06-01")` | | 7 | `search("adverse OR serious -mild")` | | 8 | `search('"serious adverse event" -draft -obsolete', ext=["docx","pdf"])` | | 9 | `search('icotrokinra placebo', study="UCO3001", folder="Training", limit=30)` | | 10 | `search('"lot expiration" OR "expirační" OR "expiry"', ext=["eml","msg","pdf"], since="2025-01-01")` | --- ## 1. Nejjednodušší — jedno slovo ```python search("randomization") ``` **Co to dělá:** Najde všechny dokumenty z obou studií, které kdekoli v textu obsahují slovo "randomization". Bez filtru typu souboru, studie, ani data. Vrátí 15 nejlépe rankovaných. **Kdy použít:** Když máš jen obecné slovo a nevíš kde to může být. Dobré pro první nástřel — uvidíš, ve kterých typech souborů a v kterých složkách se to vyskytuje. **Trik:** Slovník indexu používá `unaccent`, takže `príloha` najde i `priloha` (diakritika neřeší). --- ## 2. Dvě slova — implicitní AND ```python search("adverse event") ``` **Co to dělá:** Najde dokumenty, kde se vyskytují **obě** slova "adverse" a "event" — ale **kdekoli v dokumentu**, nemusí být vedle sebe. Mohou být klidně na různých stranách. **Kdy použít:** Když chceš zúžit širší slovo (`adverse` samotné by našlo i `adversely`). Dvě slova = silnější rank. **Rozdíl proti #3:** "adverse" může být na straně 5 a "event" na straně 150 — pořád match. --- ## 3. Přesná fráze ```python search('"protocol deviation"') ``` **Co to dělá:** Najde dokumenty, kde jsou tato dvě slova **přímo vedle sebe** v tomto pořadí. "protocol of deviation" už nematchne, "deviation from protocol" taky ne. **Kdy použít:** Pro odborné termíny, názvy formulářů, ustálené fráze. Mnohem ostřejší než AND. **Pozor:** Uvozovky musí být přesně `"..."` (PowerShell může vyžadovat escape: `'"protocol deviation"'`). --- ## 4. Filtr typu souboru ```python search("randomization", ext=["xlsx", "xlsm"]) ``` **Co to dělá:** Stejné jako #1, ale jen v Excelech (`.xlsx` + `.xlsm`). Užitečné když víš, že to bude v tabulce — typicky randomizační listy, IWRS exporty. **Kdy použít:** Když chceš najít data, ne dokumentaci. Excel = data tabulky, PDF/DOCX = popis. **Tip:** Metadata v odpovědi obsahují `sheet_names` — uvidíš ve kterých listech to může být. Pak otevřeš ten Excel rovnou na správném listu. --- ## 5. Studie + typ — kombinovaný filtr ```python search("SAE", study="UCO3001", ext=["eml", "msg"]) ``` **Co to dělá:** Najde emaily (EML i MSG) z **UCO3001 studie**, které obsahují slovo "SAE" (Serious Adverse Event). Metadata vrátí `from`, `to`, `subject`, `date`, počet příloh. **Kdy použít:** "Kdo mi psal o SAE případu" — typický audit dotaz. **Trik:** Kombinace `study + ext` je výkonná — Postgres má index `(study, ext)` přímo na to. --- ## 6. Tři filtry — fráze + složka + datum ```python search('"kit number"', folder="CRF", since="2025-06-01") ``` **Co to dělá:** Najde dokumenty obsahující frázi "kit number", ale jen ty **uložené v jakékoli složce s "CRF" v názvu**, a **modifikované od 1. června 2025** dál. **Kdy použít:** Když si pamatuješ kontext ("bylo to v CRF dokumentaci po SIVu") ale ne celý text. **Jak to funguje pod kapotou:** 1. Postgres najde fulltextové matche 2. Mongo dotáhne `parent_folders` a `mtime` 3. Filtruje se v Pythonu — proto se to dělá jako AND nad všemi třemi --- ## 7. OR + NOT — logické operátory ```python search("adverse OR serious -mild") ``` **Co to dělá:** Najde dokumenty, kde je **buď** "adverse" **nebo** "serious", ale **nesmí** obsahovat slovo "mild". **Kdy použít:** Když máš více synonym a chceš jeden dotaz místo tří. `-mild` vyloučí typicky tréninkové materiály ("mild AE example") nebo nezávažné případy. **Důležité — priorita operátorů:** - `A OR B C` se vyhodnotí jako `A OR (B AND C)` - `websearch_to_tsquery` **nemá závorky** — nemůžeš to přeskupit - Když potřebuješ jiné pořadí, rozděl na dva dotazy --- ## 8. Fráze + dvě vyloučení + ext filtr ```python search('"serious adverse event" -draft -obsolete', ext=["docx", "pdf"]) ``` **Co to dělá:** Přesná fráze "serious adverse event", ale **bez** dokumentů obsahujících slova "draft" nebo "obsolete", a jen v Wordech a PDFkách. **Kdy použít:** Když chceš jen **finální** verze dokumentů. V Dropboxu typicky najdeš 5 verzí toho samého (draft, v0.9, v1.0, v1.0_FINAL, OBSOLETE) — tohle odřízne šum. **Kombinace technik:** fráze + vícenásobné NOT + typ. Reálné dotazy v práci vypadají takhle. --- ## 9. Dvě AND slova + 2 filtry + víc výsledků ```python search("icotrokinra placebo", study="UCO3001", folder="Training", limit=30) ``` **Co to dělá:** Najde tréninkové materiály z UCO3001, kde se mluví **jak o léku icotrokinra, tak o placebu** (typicky srovnání ramen studie). `limit=30` místo defaultních 15. **Kdy použít:** - Onboarding nového člena týmu — "dej mi všechny prezentace co srovnávají větve studie" - Příprava na monitorovací návštěvu - Hledání edukačního obsahu pro pacienty **Proč 30:** Tréninkových materiálů bývá hodně verzí (každý SIV nové), default 15 by jich pravděpodobně neukázal všechny. --- ## 10. Nejtěžší — vícejazyčné OR + tři typy + datum ```python search( '"lot expiration" OR "expirační" OR "expiry"', ext=["eml", "msg", "pdf"], since="2025-01-01" ) ``` **Co to dělá:** Najde **dokumentaci a komunikaci o expiraci léků** z roku 2025. Hledá ve třech jazykových variantách (EN fráze "lot expiration", CZ "expirační", krátké "expiry") napříč emaily, MSG soubory a PDFkami. **Kdy použít:** Typický compliance dotaz — "ukaž mi všechno co tento rok řešilo expiraci kitů". Kombinuje: - **vícejazyčnost** (sponsor píše anglicky, ty notifikuješ česky) - **více kanálů** (emaily i oficiální PDF dokumenty) - **časové okno** (relevantní jen letošek) **Pod kapotou:** 1. PG fulltext spojí 3 OR větve do jednoho tsquery 2. Filtr `ext` IN ('eml','msg','pdf') na PG úrovni 3. Filtr `since` na sloupec `mtime` (indexovaný) 4. Mongo metadata: u emailů `from/to/subject`, u PDF `pages/author` 5. Výsledky setřízené podle `ts_rank` (nejvíc relevantní nahoře) **Tohle je ten případ kdy nakombinuješ úplně všechno** a Claude ti pak v chatu napíše: *"Našel jsem 8 dokumentů. 3 emaily od monitorky z března, 1 PDF notifikace IWRS z června, ..."*. Přesně proto jsme to stavěli. --- ## Shrnutí — pravidla palce - **Začni jednoduše** (1 slovo) → uvidíš co je v korpusu → zužuj - **Fráze (`"..."`)** je vždy ostřejší než AND - **`-slovo`** je tvůj nejlepší kamarád proti šumu (draft, obsolete, training) - **`ext=[...]`** dramaticky zrychlí dotaz a vyfiltruje formátový šum - **`folder=...`** funguje skvěle pokud máš konzistentní strukturu složek (#190 eCRF, #200 Training, …) - **`since=...`** používej kdykoli tě zajímá "co je nového" - **Diakritika neřeší** — `expirace` najde i `expirační` (oboje má root `expira`) - **Není wildcard** — `randomiz*` nefunguje, ale `randomization` a `randomized` jsou různá slova → dej je do OR --- ## Co když fulltext nestačí? Jiné nástroje MCP: - **`by_author("Hazzard")`** — kdo psal/upravoval (DOCX/PPTX metadata) - **`recent_files(days=7)`** — co se změnilo bez ohledu na obsah - **`find_duplicates()`** — kolikrát mám stejný soubor - **`browse_folder("CRF")`** — výpis složky bez fulltextu - **`read_document(path=..., around_match="randomization")`** — skok přímo na slovo v dlouhém dokumentu