Skip to content

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.

  • 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+F and the editor’s Find/Replace work on the decrypted note in your current session, the same as any text editor.

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.

  • 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.

  1. Your query is embedded (the query model is asymmetric to the document model, tuned for retrieval rather than indexing)
  2. Qdrant returns top-K vector matches with binary quantization + rescore
  3. If a reranker is configured (RERANKER_BACKEND=jina + JINA_URL on 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.

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.

  • 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.