Node.js SDK对接向量数据库

本文介绍如何使用JavaScript语言调用openGauss向量数据库

环境准备

1. npm install & npm run build

基本操作

1.连接数据库

1. const connect = async (host, port, username, database, password) => {
2. const config = {
3. host: host,
4. port: port,
5. username: username,
6. database: database,
7. password: password
8. };

10. const client = new Client(config);
11. await client.connect();
12. return client;
13. }

2.创建表

1. const create_table = async (client, table_name, dim) => {
2. const querystr = `
3. CREATE TABLE IF NOT EXISTS public.${table_name} (id BIGINT PRIMARY KEY, embedding vector(${dim}));
4. `;
5. const result = await client.query(querystr);
6. }

3.创建索引

1. const create_index = async (client, table_name, index_name) => {
2. const querystr = `
3. CREATE INDEX IF NOT EXISTS ${index_name} ON public.${table_name} USING hnsw (embedding vector_l2_ops);
4. `;
5. const result = await client.query(querystr);
6. }

4.插入/删除/更新数据

  • 插入
1. const insert_vector = async (client, table_name, vector, id) => {
2. const querystr = `
3. INSERT INTO public.${table_name} (id, embedding) VALUES(${id}, '${vector}');
4. `;
5. const result = await client.query(querystr);
6. }
  • 删除
1. const delete_vector = async (client, table_name, id) => {
2. const querystr = `
3. DELETE FROM public.${table_name} WHERE id = ${id};
4. `;
5. const result = await client.query(querystr);
6. }
  • 更新
1. const update_vector = async (client, table_name, vector, id) => {
2. const querystr = `
3. UPDATE public.${table_name} SET embedding = '${vector}' WHERE id = ${id};
4. `;
5. const result = await client.query(querystr);
6. }

5.查询

1. const query = async (client, table_name, vector, topk) => {
2. const querystr = `
3. SELECT * FROM public.${table_name} ORDER BY embedding <-> '${vector}'::vector LIMIT ${topk}::int;
4. `;
5. const result = await client.query(querystr);
6. return result;
7. }

6.删除表

1. const delete_table = async (client, table_name) => {
2. const querystr = `
3. DROP TABLE IF EXISTS public.${table_name};
4. `;
5. const result = await client.query(querystr);
6. }

7.关闭连接

1. const close = async (client) => {
2. await client.end();
3. }

8.多向量并发查询

多向量召回支持在单次搜索请求中同时提交多个查询向量,openGauss将并行对查询向量进行搜索,并返回多组结果。

函数名

1. async executeMultiSearch(dbConfig, sqlTemplate, paramsList, searchParams, maxThreads)

输入参数

  • dbConfig:数据库连接配置,包含user、password、host、database、port
  • sqlTemplate:查询语句,要求是单条查询语句(select为首单词)、包含向量操作符(<->/<=>/<#>/<+>/<~>/<%>)
  • paramsList:查询参数,要求不为空
  • searchParams:需要通过set设置的参数(如hnsw_ef_search、nprobes)
  • maxThreads:连接池最大连接数,和数据库最大连接数(由参数max_connections设置)有关,一般来说,连接池最大连接数要小于数据库最大连接数,但是数据库对于管理员用户的连接限制会略超过max_connections设置。

输出参数

  • 查询结果,形式为[[{id:1, embedding:'[1,2,3]'},{id:2, embedding:'[2,2,2]'}], [],...],表示n个查询向量对应的limit个结果。

使用案例

1. const { ParallelSearch } = require('pg')
2. async function run() {
3. const dbConfig = {
4. user: 'username',
5. host: 'localhost',
6. database: "dbname",
7. password: "yourpassword",
8. port: yourport
9. };

11. const sqlTemplate = 'SELECT id, embedding FROM test_table1 ORDER BY embedding <-> $1 LIMIT $2;';

13. const searchParams = {
14. hnsw_ef_search: 40,
15. enable_seqscan: 'off'
16. };
17. const paramsList = [
18. [JSON.stringify([5,5,5]), 3],
19. [JSON.stringify([2,2,2]), 5]
20. ];

22. const queryManager = new ParallelSearch();
23. try {
24. const results = await queryManager.executeMultiSearch(dbConfig, sqlTemplate, paramsList, searchParams,2);
25. console.log(results)
26. results.forEach((res, idx) => {
27. console.log(`\n查询 ${idx + 1} 结果:`);
28. if (res.success) {
29. console.log('数据列表:', res.data);
30. } else {
31. console.log('错误:', res.error);
32. }
33. });
34. } catch (err) {
35. console.error('执行失败:', err.message);
36. }
37. }

39. run().catch(console.error);

用例

1. const client = connect('host', 5432, 'username', 'postgres', 'password');
2. create_table(client, 'test_table1', 3);
3. create_index(client, 'test_table1', 'idx_test1');
4. insert_vector(client, 'test_table1', '[1.2, 3, 5]', 0);
5. insert_vector(client, 'test_table1', '[4.3, 5.2, 1]', 1);
6. update_vector(client, 'test_table1', '[1, 3, 3]', 1);
7. query(client, 'test_table1', '[1, 2, 2]', 1);
8. delete_vector(client, 'test_table1', 0);
9. delete_table(client, 'test_table1');
10. close(client);

注:实例SDK代码中,函数均为async函数,实际使用中需要视情况增加await。

1. const client = await connect('host', 5432, 'username', 'postgres', 'password');
2. await create_table(client, 'test_table1', 3);
3. ...
4. await close(client);