211 lines
8.3 KiB
Markdown
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
|