+
95
-

回答

有很多,Node.js 确实有一些类似于 SQLite 的文件向量数据库解决方案。以下是几个值得考虑的选项:

LanceDB

LanceDB 是一个嵌入式向量数据库,专门为机器学习和 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 则提供了高效的向量索引和搜索功能,但需要额外的工作来实现持久化存储。

选择哪个解决方案取决于你的具体需求,如数据量大小、查询速度要求、额外功能需求等。建议你根据自己的使用场景测试这些选项,以找到最适合的解决方案。

网友回复

我知道答案,我要回答