feat(search): add pluggable lexical backends#713
Open
pavel-voronin wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a pluggable lexical search backend layer while keeping SQLite FTS5 as the default behavior.
This lets QMD delegate lexical retrieval to an external backend without replacing QMD itself. QMD remains responsible for the SQLite store, collections, document hydration, snippets, context lookup, vector search, RRF, and reranking.
What Changed
LexicalSearchBackendLexicalSearchRequestLexicalSearchHitLexicalBackendConfigcreateStore({ lexicalBackend })store.searchLex(...)uses the configured lexical backend.lexqueries use the configured lexical backend.Compatibility
SQLite FTS5 remains the default lexical backend. Existing users who do not configure
search.lexicalBackendshould keep the same behavior.Search results still use
source: "fts"for lexical results to preserve pipeline compatibility. A newlexicalBackendfield exposes the concrete backend name for observability.Testing
Verified locally:
npm run test:typesnpm run buildvitest test/sdk.test.ts -t "custom lexical backend"vitest test/bin-wrapper.test.tsqmd updateqmd search ... --format json