Skip to Content
QMD Search SDKIndexer & Plugins

Indexer & Plugins

Der Indexer erstellt und aktualisiert den Such-Index. Content-Sources werden ueber ein Plugin-System geladen.

Collections

Jede Collection ist ein benannter Bereich im Index mit eigenem Pfad und Pattern:

const indexer = createIndexer({ dbPath: './data/index.sqlite', collections: [ { name: 'docs', path: './content', pattern: '**/*.md', context: 'Dokumentation', group: 'Platform' }, { name: 'blog', path: './blog', pattern: '**/*.mdx', context: 'Blog-Artikel', group: 'Allgemein' }, { name: 'changelogs', path: './changelogs', pattern: '**/*.md', context: 'Release Notes', group: 'Changelogs' }, ], plugins: [filesystemSource, githubSource], });
FeldBeschreibung
nameEindeutiger Name (fuer Filter in der Suche)
pathPfad zum Quellverzeichnis
patternGlob-Pattern fuer Dateien
contextBeschreibung fuer LLM-Suche
groupGruppierung (fuer UI-Filter)

Built-in Plugins

Filesystem-Source

Liest lokale Dateien aus einem Verzeichnis:

{ plugin: 'filesystem', config: { path: './docs', pattern: '**/*.md', collection: 'docs', }}

GitHub-Source

Laedt Dateien von GitHub-Repositories:

// Einzeldateien { plugin: 'github', config: { collection: 'changelogs', files: [ { owner: 'org', repo: 'repo-a', branch: 'main', path: 'CHANGELOG.md', outputName: 'repo-a.md' }, ], }} // Zwei Dateien mergen (z.B. Changelog + Dev-Changelog) { plugin: 'github', config: { collection: 'changelogs', mergeFiles: [ { primary: { owner: 'org', repo: 'repo', branch: 'main', path: 'Changelog.md' }, secondary: { owner: 'org', repo: 'repo', branch: 'main', path: 'Changelog-Dev.md' }, outputName: 'repo.md', label: 'Repo', }, ], }} // Verzeichnis auflisten { plugin: 'github', config: { collection: 'faq', directories: [ { owner: 'org', repo: 'repo', branch: 'main', path: 'faq/', outputPrefix: 'faq', label: 'FAQ' }, ], }}

Das GitHub-Plugin benoetigt einen Token (GITHUB_TOKEN Env-Var oder config.token).

Embeddings

Fuer Hybrid-Suche koennen beim Indexieren Vektor-Embeddings generiert werden:

const indexer = createIndexer({ // ... embedProvider: { provider: 'voyage', // oder 'openai' apiKey: process.env.VOYAGE_API_KEY, domainContext: 'eine technische Dokumentation', maxRetries: 5, retryBaseMs: 3000, }, skipEmbed: false, // Default });

Der Indexer nutzt Delta-Erkennung — nur geaenderte Dokumente werden neu embedded.

Callbacks

await indexer.run({ onUpdateProgress: (info) => { console.log(`${info.collection}: ${info.current}/${info.total}`); }, onEmbedProgress: (info) => { console.log(`Embedding: ${info.chunksEmbedded}/${info.totalChunks}`); }, });