search_keyword
Pure keyword (BM25) search — fastest option, optimal for exact-term lookups: paper titles, author names, method names (e.g. "LoRA", "RLHF"), arXiv IDs. Does NOT use semantic vectors. Use this when you know the specific term you're looking for. For paraphrased or conceptual queries, prefer "search_semantic" or "search". ★ Ranking is over at most 20 000 matching chunks: a COMMON term (or any_words over several) overflows that, and then pool.keyword.truncated=true says the ranking covered only the earliest-stored matches — narrow the query to get a full ranking. This is what keeps an answer under a few seconds instead of minutes.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return | |
| match | No | How the words are combined. DEFAULT 'all_words' — EVERY word must appear in the chunk, which is why long queries often return nothing. ⚠️ MEASURED 2026-09-11 over archived all_words traffic: 6-10 word queries CAME BACK empty 78% of the time on this door — a figure about that traffic under that mode, which this parameter exists to change. Adding more words makes the default stricter, not broader. ⚠️ Matching happens INSIDE ONE CHUNK, so that figure depends on the CURRENT chunking policy as much as on the mode — re-measure if you need a current one rather than relying on this. stricter, not broader. Use 'any_words' to find chunks matching ANY of them, and 'phrase' for the words adjacent and in order. ⚠️ Writing `or` in the query text does NOT ask for any_words — it is dropped as a stop word; name the mode instead. | |
| query | Yes | Search query — exact terms work best (method names, IDs, titles). NOTE: BM25 ranks by chunk-level term frequency; for canonical paper lookup by exact name (e.g. "LoRA" → original LoRA paper), prefer find_by_id by arxivId or title-search. This tool may surface papers that mention the term frequently but are not the canonical source. | |
| dateTo | No | Filter: published on or before (ISO date) | |
| detail | No | 'minimal' = id+title+snippet+score. 'standard' = adds metadata + chunkContext. 'full' = adds entities/selfContained/scores/licenses map | |
| facets | No | If true, return facets block: count breakdown by contentType + top entities mentioned | |
| run_id | No | Optional. The active methodist run_id (as returned by the methodist diagnose / get_current_dose door). Pass it whenever you call this tool while working inside a run, so the call is attributed to that run for the §8 usage crosscheck — attribution is run-anchored, so it stays correct even if your access token refreshes mid-run. Must be YOUR run: a run_id owned by a different principal, or a non-existent run_id, is rejected. | |
| dateFrom | No | Filter: published on or after (ISO date) | |
| entities | No | Soft filter by entity (method names like "BERT", datasets like "SQuAD", metrics like "BLEU"), case-insensitive. Matching chunks rank first; chunks with no entities recorded (legacy gap) fall to the bottom rather than being dropped; chunks with non-matching entities are excluded. | |
| categories | No | Filter by arXiv categories (e.g. cs.AI, cs.LG) | |
| contentType | No | Filter chunks by type. Use [methodology] for HOW researchers approach a problem; [results] for OUTCOMES; [survey, background] for context | |
| diversifyBy | No | 'document' (default): max N chunks per paper. 'keyConcept': diversify by main idea (good for landscape view). 'contentType': mix methodology/results/etc. | document |
| maxPerDocument | No | Max chunks per single key (only when diversifyBy=document) |