16 releases (4 breaking)

new 0.7.1 Jul 17, 2024
0.6.0 Jun 25, 2024
0.4.14 Mar 25, 2024
0.0.1 Mar 18, 2023

#80 in Database implementations

Download history 191/week @ 2024-03-27 102/week @ 2024-04-03 251/week @ 2024-04-10 85/week @ 2024-04-17 292/week @ 2024-04-24 227/week @ 2024-05-01 351/week @ 2024-05-08 169/week @ 2024-05-15 275/week @ 2024-05-22 311/week @ 2024-05-29 275/week @ 2024-06-05 190/week @ 2024-06-12 316/week @ 2024-06-19 198/week @ 2024-06-26 131/week @ 2024-07-03 172/week @ 2024-07-10

857 downloads per month
Used in vec-embed-store


6.5K SLoC

LanceDB Rust

img Docs.rs

LanceDB Rust SDK, a serverless vector database.

Read more at: https://lancedb.com/

[!TIP] A transitive dependency of lancedb is lzma-sys, which uses dynamic linking by default. If you want to statically link lzma-sys, you should activate it's static feature by adding the following to your dependencies:

lzma-sys = { version = "*", features = ["static"] }


LanceDB is an open-source database for vector-search built with persistent storage, which greatly simplifies retrevial, filtering and management of embeddings.

The key features of LanceDB include:

  • Production-scale vector search with no servers to manage.
  • Store, query and filter vectors, metadata and multi-modal data (text, images, videos, point clouds, and more).
  • Support for vector similarity search, full-text search and SQL.
  • Native Rust, Python, Javascript/Typescript support.
  • Zero-copy, automatic versioning, manage versions of your data without needing extra infrastructure.
  • GPU support in building vector indices[^note].
  • Ecosystem integrations with LangChain 🦜️🔗, LlamaIndex 🦙, Apache-Arrow, Pandas, Polars, DuckDB and more on the way.

[^note]: Only in Python SDK.

Getting Started

LanceDB runs in process, to use it in your Rust project, put the following in your Cargo.toml:

cargo install lancedb

Crate Features

Experimental Features

These features are not enabled by default. They are experimental or in-development features that are not yet ready to be released.

  • remote - Enable remote client to connect to LanceDB cloud. This is not yet fully implemented and should not be enabled.

Quick Start

Connect to a database.

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

LanceDB accepts the different form of database path:

  • /path/to/database - local database on file system.
  • s3://bucket/path/to/database or gs://bucket/path/to/database - database on cloud object store
  • db://dbname - Lance Cloud

You can also use ConnectOptions to configure the connection to the database.

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,

LanceDB uses arrow-rs to define schema, data types and array itself. It treats FixedSizeList<Float16/Float32> columns as vector columns.

For more details, please refer to LanceDB documentation.

Create a table

To create a Table, you need to provide a arrow_schema::Schema and a arrow_array::RecordBatch stream.

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

let schema = Arc::new(Schema::new(vec![
    Field::new("id", DataType::Int32, false),
        DataType::FixedSizeList(Arc::new(Field::new("item", DataType::Float32, true)), 128),
// Create a RecordBatch stream.
let batches = RecordBatchIterator::new(
                FixedSizeListArray::from_iter_primitive::<Float32Type, _, _>(
                    (0..256).map(|_| Some(vec![Some(1.0); 128])),
db.create_table("my_table", Box::new(batches))

Create vector index (IVF_PQ)

use lancedb::index::Index;
tbl.create_index(&["vector"], Index::Auto)
let results = table
    .nearest_to(&[1.0; 128])


~1.5M SLoC