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数据库实现

Download history 298/week @ 2024-05-03 284/week @ 2024-05-10 239/week @ 2024-05-17 320/week @ 2024-05-24 284/week @ 2024-05-31 182/week @ 2024-06-07 192/week @ 2024-06-14 341/week @ 2024-06-21 156/week @ 2024-06-28 108/week @ 2024-07-05 416/week @ 2024-07-12 444/week @ 2024-07-19 379/week @ 2024-07-26 343/week @ 2024-08-02 148/week @ 2024-08-09 81/week @ 2024-08-16

每月 1,020 次下载
用于 vec-embed-store

Apache-2.0

350KB
7K SLoC

LanceDB Rust

img Docs.rs

LanceDB Rust SDK,一个无服务器向量数据库。

更多信息请查看:https://lancedb.com/

[!TIP] LanceDB 的一个传递依赖项 lancedblzma-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/databasegs://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