19 个版本 (6 个重大变更)
0.9.0 | 2024年8月7日 |
---|---|
0.8.0 | 2024年7月26日 |
0.7.2 | 2024年7月23日 |
0.4.14 | 2024年3月25日 |
0.0.1 | 2023年3月18日 |
#28 在 数据库实现
每月 1,020 次下载
用于 vec-embed-store
350KB
7K SLoC
LanceDB Rust
LanceDB Rust SDK,一个无服务器向量数据库。
更多信息请查看:https://lancedb.com/
[!TIP] LanceDB 的一个传递依赖项
lancedb
是lzma-sys
,它默认使用动态链接。如果您想静态链接lzma-sys
,您应该通过添加以下内容到您的依赖项中激活它的static
功能lzma-sys = { version = "*", features = ["static"] }
lib.rs
:
LanceDB 是一个开源数据库,用于构建具有持久存储的向量搜索,这大大简化了嵌入的检索、过滤和管理。
LanceDB 的主要特性包括
- 无服务器管理的生产规模向量搜索。
- 存储、查询和过滤向量、元数据和多模态数据(文本、图像、视频、点云等)。
- 支持向量相似度搜索、全文搜索和 SQL。
- 原生 Rust、Python、Javascript/Typescript 支持。
- 零拷贝、自动版本控制,无需额外基础设施即可管理数据版本。
- 构建向量索引时的 GPU 支持[^note]。
- 与 LangChain 🦜️🔗、LlamaIndex 🦙、Apache-Arrow、Pandas、Polars、DuckDB 等生态系统集成。
[^note]: 仅在 Python SDK 中。
入门指南
LanceDB 在进程中运行,要在您的 Rust 项目中使用它,请将以下内容放入您的 Cargo.toml
cargo install lancedb
软件包功能
实验功能
这些功能默认未启用。它们是实验性或开发中的功能,尚未准备好发布。
remote
- 启用远程客户端连接到LanceDB云。这尚未完全实现,不应启用。
快速入门
连接到数据库。
let db = lancedb::connect("data/sample-lancedb").execute().await.unwrap();
LanceDB接受不同形式的数据库路径
/path/to/database
- 文件系统上的本地数据库。s3://bucket/path/to/database
或gs://bucket/path/to/database
- 云对象存储上的数据库db://dbname
- Lance Cloud
您还可以使用 ConnectOptions
来配置数据库连接。
use object_store::aws::AwsCredential;
let db = lancedb::connect("data/sample-lancedb")
.aws_creds(AwsCredential {
key_id: "some_key".to_string(),
secret_key: "some_secret".to_string(),
token: None,
})
.execute()
.await
.unwrap();
LanceDB使用 arrow-rs 来定义模式、数据类型以及数组本身。它将 FixedSizeList<Float16/Float32>
列作为向量列。
有关更多详细信息,请参阅 LanceDB文档。
创建表
要创建表,您需要提供一个 arrow_schema::Schema
和一个 arrow_array::RecordBatch
流。
use arrow_array::{RecordBatch, RecordBatchIterator};
use arrow_schema::{DataType, Field, Schema};
let schema = Arc::new(Schema::new(vec![
Field::new("id", DataType::Int32, false),
Field::new(
"vector",
DataType::FixedSizeList(Arc::new(Field::new("item", DataType::Float32, true)), 128),
true,
),
]));
// Create a RecordBatch stream.
let batches = RecordBatchIterator::new(
vec![RecordBatch::try_new(
schema.clone(),
vec![
Arc::new(Int32Array::from_iter_values(0..256)),
Arc::new(
FixedSizeListArray::from_iter_primitive::<Float32Type, _, _>(
(0..256).map(|_| Some(vec![Some(1.0); 128])),
128,
),
),
],
)
.unwrap()]
.into_iter()
.map(Ok),
schema.clone(),
);
db.create_table("my_table", Box::new(batches))
.execute()
.await
.unwrap();
创建向量索引(IVF_PQ)
use lancedb::index::Index;
tbl.create_index(&["vector"], Index::Auto)
.execute()
.await
.unwrap();
打开表并执行搜索
let results = table
.query()
.nearest_to(&[1.0; 128])
.unwrap()
.execute()
.await
.unwrap()
.try_collect::<Vec<_>>()
.await
.unwrap();
依赖项
~93MB
~1.5M SLoC