Search
Engram indexes note content for semantic search, which finds notes that mean something similar to your query, even when the wording differs. Exact-match search is supported too, but where it runs depends on the scope.
How Engram searches
Section titled “How Engram searches”- Semantic search across the whole vault. Vector similarity over embeddings of every note. Finds related ideas, not just literal text. This is what runs from the web app’s search panel today.
- Keyword and hybrid search. The backend also indexes notes for encryption-safe keyword (lexical) search and a hybrid mode that fuses lexical and vector results (see below). These ship in the backend; the web app’s search panel does not yet expose a mode switch, so it issues semantic queries for now.
- Exact match inside an open note.
Ctrl/Cmd+Fand the editor’s Find/Replace work on the decrypted note in your current session, the same as any text editor.
What about literal / regex search?
Section titled “What about literal / regex search?”Engram supports keyword (lexical) search over your whole vault, and
it does so without breaking encryption at rest. Rather than scanning
plaintext, the backend indexes a per-chunk sparse vector keyed by
HMAC(your vault key, token), so the server can match query terms
against the index without ever holding readable note text. Keyword,
semantic (vector), and hybrid (lexical + vector fused server-side
via reciprocal-rank fusion) modes are all live in the backend.
This means true substring/regex search over raw text still isn’t
possible server-side (the index is over tokens, not characters), so for
regex, case-sensitive, or path-filtered literal search, Obsidian’s local
Search pane (running over your on-disk .md files) remains the tool. The
editor’s Ctrl/Cmd+F also works for find-within-an-open-note.
Engram and Obsidian search are complementary: semantic, keyword, and hybrid in the cloud; full regex / case-sensitive / path-filtered literal search on disk. Obsidian’s local Search pane runs against the same vault Engram is syncing.
Where to search from
Section titled “Where to search from”- Web app search panel (the search rail): semantic queries today
- Obsidian plugin runs search against the same backend as the web app
- Obsidian Search pane for local regex / case-sensitive / path literal search over the on-disk vault
For a regex pattern or path-scoped literal match, drop into Obsidian’s local search.
How the ranking works
Section titled “How the ranking works”- Your query is embedded (the query model is asymmetric to the document model, tuned for retrieval rather than indexing)
- Qdrant returns top-K vector matches with binary quantization + rescore
- If a reranker is configured (
RERANKER_BACKEND=jina+JINA_URLon the backend), candidates are reordered with a 40/60 blend of vector and reranker scores; if not, raw vector ranking is used
The default cloud deployment runs without a reranker today; the Jina adapter is shipped and ready to enable.
Folder scoping
Section titled “Folder scoping”Restricting search to a folder is supported through the API. Pass
a folder=<path> query parameter. A search-box query syntax like
folder:work/ is on the roadmap, not yet wired in the UI.
When semantic search underperforms
Section titled “When semantic search underperforms”- Vault is very small (< 20 notes). Fewer embeddings to compare against; results lean noisy until your vault grows
- Recently imported notes. Embedding runs asynchronously via Oban; freshly written notes can take a few seconds to appear in results
- Highly specific jargon. Semantic similarity is best for concepts. For exact identifiers (a function name, an error code), keyword and hybrid (lexical + vector) search are the better fit. Both are live in the backend, with web-app UI exposure still to come. In the meantime, Obsidian’s local search covers exact identifiers.