DuckDB-backed indexer implementation: full-text search + vector similarity on top of @statewalker/db-api.
pnpm add @statewalker/indexer-duckdb @statewalker/db-duckdb-nodeimport { createDuckDbIndexer } from "@statewalker/indexer-duckdb";
import { createDuckDbNodeClient } from "@statewalker/db-duckdb-node";
const db = await createDuckDbNodeClient({ path: "./index.duckdb" });
const idx = await createDuckDbIndexer({ db });createDuckDbIndexer installs and loads two DuckDB extensions on startup:
fts— BM25 full-text search. The indexer callsPRAGMA create_fts_index(...)and queries viafts_main_<table>.match_bm25(id, query). The FTS index is rebuilt lazily: the retriever tracks a dirty flag set on everyaddDocument/deleteDocumentscall and rebuilds on the firstsearchthereafter (or sooner via explicitflush()).vss— HNSW vector similarity index.SET hnsw_enable_experimental_persistence = true;is also set so HNSW indexes survive database close/reopen.
Both extensions ship with DuckDB and are fetched from the DuckDB extension repository on first INSTALL. Running createDuckDbIndexer in an environment that blocks extension downloads will fail at init time with the missing-extension error surfaced by DuckDB.
createDuckDbIndexer(options)— returns a hybrid FTS + vector indexer.
@statewalker/indexer-api,@statewalker/db-api,@statewalker/db-duckdb-node.