有很多,Node.js 确实有一些类似于 SQLite 的文件向量数据库解决方案。以下是几个值得考虑的选项:
LanceDBLanceDB 是一个嵌入式向量数据库,专门为机器学习和 AI 应用设计。它支持 Node.js,并且可以直接存储在文件系统中。
特点:
支持向量搜索和过滤兼容 Apache Arrow 格式可以直接在文件系统上操作,无需额外的服务器示例代码:
const lancedb = require("vectordb"); async function example() { const db = await lancedb.connect("my_db"); const table = await db.createTable("my_table", [ {vector: [1.1, 2.3, 3.5], item: "item1"}, {vector: [2.1, 3.3, 4.5], item: "item2"}, ]); const results = await table.search([1.0, 2.0, 3.0]).limit(10).execute(); console.log(results); } example();NeDB
虽然 NeDB 不是专门为向量搜索设计的,但它是一个轻量级的 JavaScript 数据库,可以完全在内存中运行或持久化到文件系统。你可以将向量存储为文档的一部分,然后实现自定义的相似性搜索逻辑。
特点:
轻量级,API 类似 MongoDB可以完全在内存中运行或持久化到文件支持索引和查询示例代码:
const Datastore = require('nedb'); const db = new Datastore({ filename: 'path/to/datafile', autoload: true }); // 存储向量 db.insert({ vector: [1.1, 2.2, 3.3], label: 'example' }, (err, newDoc) => { if (err) console.error(err); console.log('Inserted:', newDoc); }); // 查询 (需要自定义相似度计算逻辑) db.find({}, (err, docs) => { if (err) console.error(err); // 实现自定义向量相似度计算和排序 });FAISS.js
FAISS 是一个流行的向量索引库,FAISS.js 是其 JavaScript 实现。虽然它本身不是一个数据库,但你可以将它与文件系统结合使用,创建一个简单的向量数据库。
特点:
高效的向量索引和搜索支持多种索引类型可以与文件系统结合使用示例代码:
const faiss = require('faiss.js'); const fs = require('fs'); async function example() { const index = await faiss.IndexFlatL2(128); // 128 维向量 // 添加向量 const vectors = [[1.0, 2.0, ...], [2.0, 3.0, ...]]; // 128 维向量列表 await index.add(vectors); // 搜索 const queryVector = [1.1, 2.1, ...]; // 128 维查询向量 const { neighbors, distances } = await index.search(queryVector, 10); // 保存到文件 const buffer = await index.serialize(); fs.writeFileSync('index.faiss', buffer); // 从文件加载 const loadedBuffer = fs.readFileSync('index.faiss'); const loadedIndex = await faiss.IndexFlatL2.deserialize(loadedBuffer); } example();
这些选项中,LanceDB 可能是最接近你需求的解决方案,因为它专门设计用于向量存储和搜索,并且可以直接使用文件系统。NeDB 提供了更通用的文档存储功能,但你需要自己实现向量搜索逻辑。FAISS.js 则提供了高效的向量索引和搜索功能,但需要额外的工作来实现持久化存储。
选择哪个解决方案取决于你的具体需求,如数据量大小、查询速度要求、额外功能需求等。建议你根据自己的使用场景测试这些选项,以找到最适合的解决方案。
网友回复