@o-lang/semantic-doc-search 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/adapters/pgvectorAdapter.js +23 -36
package/package.json
CHANGED
|
@@ -11,57 +11,44 @@ class PgVectorAdapter {
|
|
|
11
11
|
password: config.DB_PASSWORD || process.env.DB_PASSWORD,
|
|
12
12
|
database: config.DB_NAME || process.env.DB_NAME || 'olang',
|
|
13
13
|
});
|
|
14
|
-
|
|
15
|
-
// Test connection
|
|
16
|
-
this.testConnection();
|
|
17
14
|
}
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} catch (error) {
|
|
24
|
-
console.error('❌ PgVector connection failed:', error.message);
|
|
25
|
-
throw error;
|
|
26
|
-
}
|
|
16
|
+
// Convert JavaScript array to PostgreSQL array format
|
|
17
|
+
// [1.0, 2.0, 3.0] -> {1.0,2.0,3.0}
|
|
18
|
+
arrayToPgArray(arr) {
|
|
19
|
+
return `{${arr.join(',')}}`;
|
|
27
20
|
}
|
|
28
21
|
|
|
29
22
|
async upsert({ id, vector, content, source, metadata = {} }) {
|
|
30
|
-
// Convert
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
const query = `
|
|
34
|
-
INSERT INTO doc_embeddings (id, embedding, content, source, metadata, updated_at)
|
|
35
|
-
VALUES ($1, $2::vector, $3, $4, $5, NOW())
|
|
36
|
-
ON CONFLICT (id)
|
|
37
|
-
DO UPDATE SET
|
|
38
|
-
embedding = $2::vector,
|
|
39
|
-
content = $3,
|
|
40
|
-
source = $4,
|
|
41
|
-
metadata = $5,
|
|
42
|
-
updated_at = NOW()`;
|
|
23
|
+
// Convert to PostgreSQL array format (NOT JSON)
|
|
24
|
+
const pgVector = this.arrayToPgArray(vector);
|
|
43
25
|
|
|
44
|
-
await this.pool.query(
|
|
26
|
+
await this.pool.query(
|
|
27
|
+
`INSERT INTO doc_embeddings (id, embedding, content, source, metadata)
|
|
28
|
+
VALUES ($1, $2::vector, $3, $4, $5::jsonb)
|
|
29
|
+
ON CONFLICT (id) DO UPDATE
|
|
30
|
+
SET embedding = $2::vector, content = $3, source = $4, metadata = $5::jsonb, updated_at = NOW()`,
|
|
31
|
+
[id, pgVector, content, source, JSON.stringify(metadata)]
|
|
32
|
+
);
|
|
45
33
|
}
|
|
46
34
|
|
|
47
35
|
async query(vector, topK = 5) {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
const query = `
|
|
51
|
-
SELECT id, content, source, metadata,
|
|
52
|
-
1 - (embedding <=> $1::vector) AS score
|
|
53
|
-
FROM doc_embeddings
|
|
54
|
-
ORDER BY embedding <=> $1::vector
|
|
55
|
-
LIMIT $2`;
|
|
36
|
+
const pgVector = this.arrayToPgArray(vector);
|
|
56
37
|
|
|
57
|
-
const res = await this.pool.query(
|
|
38
|
+
const res = await this.pool.query(
|
|
39
|
+
`SELECT id, content, source, metadata,
|
|
40
|
+
1 - (embedding <=> $1::vector) AS score
|
|
41
|
+
FROM doc_embeddings
|
|
42
|
+
ORDER BY embedding <=> $1::vector
|
|
43
|
+
LIMIT $2`,
|
|
44
|
+
[pgVector, topK]
|
|
45
|
+
);
|
|
58
46
|
|
|
59
|
-
// Return in the format your resolver expects
|
|
60
47
|
return res.rows.map(row => ({
|
|
61
48
|
id: row.id,
|
|
62
49
|
content: row.content,
|
|
63
50
|
source: row.source,
|
|
64
|
-
|
|
51
|
+
meta: row.metadata,
|
|
65
52
|
score: parseFloat(row.score)
|
|
66
53
|
}));
|
|
67
54
|
}
|