Search
Find any character, location, event, or passage across your story world using semantic, keyword, or hybrid search — globally or per project.
Find any entity, document, or canon detail across your story world — by exact phrase, by meaning, or both at once.
When to use this
Reach for search when you remember something about your story but cannot remember where it lives. You need a character’s eye color before writing the next chapter, you want every scene where two characters share dialogue, or you need to confirm whether a location was ever described as “coastal” before introducing a port. Search is faster than scrolling and more forgiving than ctrl-F: it understands paraphrase, finds entities by alias, and pulls canon rules into the same result list.
Semantic vs keyword vs hybrid
PlotLens runs three flavors of search. Pick based on what you remember.
- Keyword search matches the literal tokens you type against the indexed text. Use it for proper names, exact phrases, and quoted dialogue:
Aerith Gainsborough,"by the old well",Stormbreaker. Results are ranked by classic full-text relevance and returned with highlighted snippets. - Semantic search embeds your query as a vector and finds passages with similar meaning, even when no words overlap. Use it for paraphrase and conceptual queries:
the moment the captain doubts her crew,descriptions of grief in the second act,scenes that feel like a betrayal. It is the only mode that will surface a passage that means what you typed without containing what you typed. - Hybrid search is the default. It runs keyword and semantic in parallel, then fuses the two ranked lists with reciprocal rank fusion. Use it whenever you are not sure — hybrid wins on recall and is the right starting point for almost every query. Switch to a single mode only when you specifically want to suppress one signal.
A practical rule: if your query contains a name or a quote, keyword will be faster and more precise; if your query is a description of an idea or a feeling, semantic will catch what keyword misses; for everything in between, leave hybrid on.
Where to search from
You have two entry points:
- Global search at
/searchruns across every project you can access. Use it when you do not yet know which project a detail lives in, or when you are working across a series, sequels, or shared universes. The page shows results on the left and a preview of the selected result on the right, with scope pills you can click to narrow to a single project. - Per-project search at
/projects/{slug}/searchis scoped to one project. Use it once you are inside a manuscript and want to stay there — temporal filters (chapter range, story-position cutoffs) and POV/speaker filters are most useful here.
Both pages share the same underlying engine and result shape; the difference is the default scope and which filters are exposed.

How to search
- Open Search from the left sidebar, or press the search affordance from any project page to land on its scoped search.
- Type your query in the search box. One character is enough to submit, but longer queries return better results.
- Pick a type filter if you want to narrow to entities, documents, or canon rules — leave it on All to see everything.
- Adjust mode if you need to. Hybrid is selected by default; switch to keyword for exact phrases, or semantic for conceptual queries.
- Press Enter or click Search. Results appear ranked by score.
- Click any result to load it in the preview pane. From there, jump to the source document, the entity detail page, or the canon rule.
- Click Load more to page through additional results.

Filters
Filters narrow the result set before ranking. Combine as many as you need.
- Type — All, Entities, Documents, or Canon rules.
- Project — Available in global search only. Pick a single project or leave on All projects.
- Chapter range — Set a minimum and maximum chapter number. Useful for “what was established before chapter 12?” questions.
- POV character — Restrict to passages written from a specific character’s point of view.
- Speaker — Restrict to lines spoken by a specific entity. Pairs well with the dialogue toggle.
- Dialogue / narration — Toggle whether results must be inside dialogue or outside it.
- Scene type — Filter by the scene classification PlotLens has tagged (action, dialogue, exposition, etc.).
- Document — Limit to one or more specific documents. You can include up to 100 document IDs in a single query.
- Date from — Only return results updated on or after this date. Accepts an ISO 8601 date.
Within a project you can also pin search to a story-position cutoff (as of ordinal), which is how PlotLens answers “what did we know at this point in the story?” without leaking later canon into your results.
Reading the results
Each result shows:
- Title — entity name, document title, or canon rule label.
- Type badge — Entity, Document, or Canon.
- Excerpt — about 200 characters of context. For keyword hits, the matched terms are highlighted.
- Score — a 0.0–1.0 relevance score. In hybrid mode this is the fused score; hover to see the contributing vector and keyword scores.
- Source label —
vector,keyword, orhybrid, indicating which path produced the result. - Project — which project the result belongs to (global search only).
- Updated — the last time the source was modified.
Sort by Score (default) for relevance, or by Date when you want the most recent matches first. The page shows 10 results by default; Load more appends the next page.
Plan availability
Search is available on every plan, including Free. There is no validation- or extraction-style monthly quota on search queries. Read operations — viewing, exporting, and searching — are always allowed.
The standard API rate limit applies: 100 requests per 60 seconds with a burst of 20. In practice you will not hit this from the UI; it only matters if you are scripting against the API.
Limits & edge cases
- Empty results — When nothing matches, the page shows “No results found.” Try broadening the query, removing filters, or switching mode (semantic often catches what keyword misses, and vice versa).
- Query too short — Queries must be at least one character. The form will not submit an empty query.
- Page size — Each request returns up to 100 results. The UI defaults to 10 per page and accumulates pages as you click Load more.
- Vector store unavailable — If the embedding service is temporarily down, hybrid and semantic searches fall back to keyword automatically. You will still get results; the source label will read
keyword. - Slow queries — Vector search typically returns in under 100ms. Very broad keyword queries over large manuscripts can take longer; add filters to speed them up.
- Temporal cutoffs and missing positions — Passages without an assigned story position are included by default when you apply an
as of ordinalfilter, so newly uploaded text does not silently disappear from results before it is positioned. - Access control — You only see results from projects you have permission to read. Private projects in other workspaces never appear in your global search.
Common pitfalls
- Searching for a name in semantic mode. Names are exactly the case where keyword wins. If you are searching for
Aerithand getting fuzzy results, switch to keyword or stay on hybrid. - Searching for a vibe in keyword mode. “The scene where she finally trusts him” has almost no useful tokens. Switch to semantic or hybrid.
- Forgetting which project you are in. Per-project search will not surface results from other projects. If you cannot find something, try global search at
/search. - Stacking too many filters. Each filter narrows the set before ranking. If results dry up, peel filters off one at a time rather than rewriting the query.
- Expecting brand-new edits to be searchable instantly. Embeddings are recomputed after document processing finishes; very recent changes may take a moment to appear in semantic results. Keyword results update as soon as the document is indexed.