diff --git a/packages/adapter-sqlite/src/index.ts b/packages/adapter-sqlite/src/index.ts index 047b8a54672..19940da5d65 100644 --- a/packages/adapter-sqlite/src/index.ts +++ b/packages/adapter-sqlite/src/index.ts @@ -337,28 +337,51 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { query_field_sub_name: string; query_match_count: number; }): Promise<{ embedding: number[]; levenshtein_score: number }[]> { + // First get content text and calculate Levenshtein distance const sql = ` + WITH content_text AS ( + SELECT + embedding, + json_extract( + json(content), + '$.' || ? || '.' || ? + ) as content_text + FROM memories + WHERE type = ? + AND json_extract( + json(content), + '$.' || ? || '.' || ? + ) IS NOT NULL + ) SELECT embedding, - 0 as levenshtein_score -- Using 0 as placeholder score - FROM memories - WHERE type = ? - AND json_extract(content, '$.' || ? || '.' || ?) IS NOT NULL + length(?) + length(content_text) - ( + length(?) + length(content_text) - ( + length(replace(lower(?), lower(content_text), '')) + + length(replace(lower(content_text), lower(?), '')) + ) / 2 + ) as levenshtein_score + FROM content_text + ORDER BY levenshtein_score ASC LIMIT ? `; - const params = [ + const rows = this.db.prepare(sql).all( + opts.query_field_name, + opts.query_field_sub_name, opts.query_table_name, opts.query_field_name, opts.query_field_sub_name, + opts.query_input, + opts.query_input, + opts.query_input, + opts.query_input, opts.query_match_count - ]; - - const rows = this.db.prepare(sql).all(...params); + ) as { embedding: Buffer; levenshtein_score: number }[]; - return rows.map((row) => ({ - embedding: row.embedding, - levenshtein_score: 0 + return rows.map(row => ({ + embedding: Array.from(new Float32Array(row.embedding as Buffer)), + levenshtein_score: row.levenshtein_score })); }