Files
janssen/Soubory/priklady_dotazu.md
2026-06-05 21:21:30 +02:00

211 lines
8.3 KiB
Markdown

# 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