42个版本 (4个重大更改)

0.4.10 2024年2月13日
0.4.7 2024年1月31日
0.4.2 2023年12月30日
0.3.8 2023年11月19日
0.1.19 2023年7月27日

#47 in 数据库实现

Download history 144/week @ 2024-03-27 216/week @ 2024-04-03 103/week @ 2024-04-10 508/week @ 2024-04-17 43/week @ 2024-04-24 83/week @ 2024-05-01 71/week @ 2024-05-08 61/week @ 2024-05-15 14/week @ 2024-05-22 15/week @ 2024-05-29 33/week @ 2024-06-05 242/week @ 2024-06-12 104/week @ 2024-06-19 2/week @ 2024-06-26 15/week @ 2024-07-03 27/week @ 2024-07-10

每月下载量173次
heapswap中使用

Apache-2.0

150KB
3K SLoC

LanceDB Rust

img Docs.rs

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

更多信息请访问:https://lancedb.com/


lib.rs:

VectorDB (LanceDB) -- 适用于AI应用的、友好的无服务器向量数据库

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 vectordb

快速入门

Rust API 还未稳定,请预期会有重大更改。

连接到数据库。

use vectordb::connect;
let db = connect("data/sample-lancedb").await.unwrap();

LanceDB 接受不同形式的数据库路径

  • /path/to/database - 文件系统上的本地数据库。
  • s3://bucket/path/to/databasegs://bucket/path/to/database - 云对象存储上的数据库
  • db://dbname - Lance Cloud

您还可以使用 ConnectOptions 来配置数据库连接。

use vectordb::{connect_with_options, ConnectOptions};
let options = ConnectOptions::new("data/sample-lancedb")
    .index_cache_size(1024);
let db = connect_with_options(&options).await.unwrap();

LanceDB 使用 arrow-rs 来定义架构、数据类型和数组本身。它将 FixedSizeList<Float16/Float32> 列视为向量列。

有关更多详细信息,请参阅 LanceDB 文档

创建表

要创建表,您需要提供一个 arrow_schema::Schema 和一个 arrow_array::RecordBatch 流。

use arrow_schema::{DataType, Schema, Field};
use arrow_array::{RecordBatch, RecordBatchIterator};

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..1000)),
            Arc::new(FixedSizeListArray::from_iter_primitive::<Float32Type, _, _>(
                (0..1000).map(|_| Some(vec![Some(1.0); 128])), 128)),
        ]).unwrap()
   ].into_iter().map(Ok),
    schema.clone());
db.create_table("my_table", Box::new(batches), None).await.unwrap();

创建向量索引(IVF_PQ)

tbl.create_index(&["vector"])
    .ivf_pq()
    .num_partitions(256)
    .build()
    .await
    .unwrap();
let results = table
    .search(&[1.0; 128])
    .execute_stream()
    .await
    .unwrap()
    .try_collect::<Vec<_>>()
    .await
    .unwrap();


依赖关系

~83MB
~1.5M SLoC