LanceDB
LanceDB 是一个开源的向量搜索数据库,具备持久化存储功能,极大地简化了嵌入向量的检索、过滤和管理。
LanceDB的主要特点
LanceDB 的主要特点包括:
-
生产级向量搜索:无需管理服务器。
-
存储、查询和过滤向量、元数据以及多模态数据(如文本、图像、视频、点云等)。
-
支持向量相似性搜索、全文搜索和 SQL。
-
原生支持 Python 和 Javascript/Typescript。
-
零拷贝、自动版本控制:无需额外基础设施即可管理数据版本。
-
支持 GPU 加速构建向量索引(*)。
-
生态系统集成:与 LangChain 🦜️🔗、LlamaIndex 🦙、Apache-Arrow、Pandas、Polars、DuckDB 等工具集成,更多集成正在开发中。
LanceDB 的核心是用 Rust 🦀 编写的,并基于 Lance 构建。
Lance 是一种开源列式数据格式,专为高性能机器学习工作负载设计。
基于NodeJS 使用 LanceDB
需要先安装NodeJS,这里对 NodeJS的部分就不做过多的介绍。关于NodeJS的介绍和安装可以参考:
npm介绍及与Node.js关联
项目创建
- 创建一个项目目录, 这里是 lancedb
- 命令行切换到该目录,执行
npm init -y
初始化项目。
这个命令就是创建 package.json 文件 - 创建src 目录用来存放源码
(src目录非必要, 也有的项目是app目录,目的就是为了让项目结构更清晰) - 安装lanceDB 的库
npm install @lancedb/lancedb
该命令的作用包括:
安装 LanceDB 客户端库:
该命令会从 npm 仓库下载并安装
@lancedb/lancedb
包。安装完成后,你可以在项目中引入 LanceDB 并使用其 API 进行向量存储、查询和管理。
更新
package.json
:
安装完成后,
@lancedb/lancedb
会被添加到package.json
文件的dependencies
或devDependencies
中(取决于你是否使用了--save-dev
选项)。示例:
json
复制
"dependencies": { "@lancedb/lancedb": "^1.0.0" }
生成
node_modules
文件夹:
- 安装的库及其依赖会被下载到项目的
node_modules
文件夹中。生成
package-lock.json
:
- 安装过程中会更新或生成
package-lock.json
文件,确保依赖版本的一致性。
编写 Javascript 代码操作LanceDB
在src 下新建一个 quickstart.js 文件,内容如下:
import * as lancedb from "@lancedb/lancedb";
const db = await lancedb.connect("data/my-lancedb");
const table = await db.createTable("vectors", [
{ id: 1, vector: [0.1, 0.2], item: "foo", price: 10 },
{ id: 2, vector: [1.1, 1.2], item: "bar", price: 50 },
], {mode: 'overwrite'});
const query = table.vectorSearch([0.1, 0.3]).limit(2);
const results = await query.toArray();
const rowsByCriteria = await table.query().where("price >= 10").toArray();
以上代码的解释如下:
1. 导入 LanceDB 库
import * as lancedb from "@lancedb/lancedb";
这行代码导入了 LanceDB 的 Node.js 客户端库。
import * as lancedb
表示将整个库的内容导入为一个命名空间lancedb
,方便后续调用其 API。
2. 连接数据库
const db = await lancedb.connect("data/my-lancedb");
使用
lancedb.connect()
方法连接到 LanceDB 数据库。
"data/my-lancedb"
是数据库的存储路径。如果路径不存在,LanceDB 会自动创建。
await
表示这是一个异步操作,等待连接完成后再继续执行后续代码。
3. 创建表并插入数据
const table = await db.createTable("vectors", [ { id: 1, vector: [0.1, 0.2], item: "foo", price: 10 }, { id: 2, vector: [1.1, 1.2], item: "bar", price: 50 }, ], { mode: 'overwrite' });
使用
db.createTable()
方法创建一个名为"vectors"
的表。第二个参数是一个数组,表示要插入的初始数据。每条数据是一个对象,包含以下字段:
id
: 唯一标识符。
vector
: 向量数据(例如[0.1, 0.2]
)。
item
: 项目的名称(例如"foo"
)。
price
: 项目的价格(例如10
)。第三个参数
{ mode: 'overwrite' }
表示如果表已经存在,则覆盖它。如果表不存在,则创建新表。
4. 向量搜索
const query = table.vectorSearch([0.1, 0.3]).limit(2); const results = await query.toArray();
使用
table.vectorSearch()
方法进行向量搜索。
[0.1, 0.3]
是查询向量,LanceDB 会查找与这个向量最相似的数据。
limit(2)
表示只返回最相似的 2 条结果。
await query.toArray()
将查询结果转换为数组并返回。结果会存储在
results
变量中,通常是一个包含相似向量数据的数组。
5. 条件查询
const rowsByCriteria = await table.query().where("price >= 10").toArray();
使用
table.query()
方法创建一个查询对象。
where("price >= 10")
是一个过滤条件,表示只返回price
字段大于或等于 10 的数据。
await query.toArray()
将查询结果转换为数组并返回。结果会存储在
rowsByCriteria
变量中,通常是一个符合条件的数据数组。
在VS Code的项目目录结构如下:
运行代码
使用node .\src\quickstart.js
命令运行代码, 运行后会在项目目录下创建 data 目录存放Db 的数据, 效果如下: