Quick Start¶
Get started with Barrel VectorDB in a few minutes.
Installation¶
Add to your rebar.config:
{deps, [
{barrel_vectordb, {git, "https://github.com/barrel-db/barrel_vectordb.git", {branch, "main"}}}
]}.
Basic Usage¶
With Embeddings¶
If you want automatic text embedding, configure an embedder:
%% Start a store with local Python embeddings
{ok, _} = barrel_vectordb:start_link(#{
name => my_store,
path => "/tmp/vectors",
embedder => {local, #{}} %% requires Python + sentence-transformers
}).
%% Add documents (text is embedded automatically)
ok = barrel_vectordb:add(my_store, <<"doc1">>, <<"Hello world">>, #{}).
ok = barrel_vectordb:add(my_store, <<"doc2">>, <<"Goodbye world">>, #{}).
%% Search with text query
{ok, Results} = barrel_vectordb:search(my_store, <<"hi there">>, #{k => 5}).
%% => [#{key => <<"doc1">>, text => <<"Hello world">>, score => 0.89, ...}, ...]
Vector-Only Mode¶
If you have pre-computed vectors, skip the embedder:
%% Start a store without embedder
{ok, _} = barrel_vectordb:start_link(#{
name => my_store,
path => "/tmp/vectors",
dimensions => 768
}).
%% Add with pre-computed vectors
ok = barrel_vectordb:add_vector(my_store, <<"doc1">>, <<"Hello">>, #{}, Vector).
%% Search with vector query
{ok, Results} = barrel_vectordb:search_vector(my_store, QueryVector, #{k => 5}).
Core API¶
Add Documents¶
%% Add with text (requires embedder)
ok = barrel_vectordb:add(Store, Id, Text, Metadata).
%% Add with explicit vector (no embedder required)
ok = barrel_vectordb:add_vector(Store, Id, Text, Metadata, Vector).
%% Add batch (requires embedder)
{ok, #{inserted := N}} = barrel_vectordb:add_batch(Store, [
{<<"id1">>, <<"text 1">>, #{type => a}},
{<<"id2">>, <<"text 2">>, #{type => b}}
]).
Search¶
%% Search with text query (requires embedder)
{ok, Results} = barrel_vectordb:search(Store, <<"query text">>, #{k => 10}).
%% Search with vector (no embedder required)
{ok, Results} = barrel_vectordb:search_vector(Store, Vector, #{k => 10}).
%% Search with metadata filter
{ok, Results} = barrel_vectordb:search(Store, <<"query">>, #{
k => 10,
filter => fun(Meta) -> maps:get(type, Meta) =:= important end
}).
%% Search with optimized options (skip text/metadata for faster results)
{ok, Results} = barrel_vectordb:search_vector(Store, Vector, #{
k => 50,
include_text => false,
include_metadata => false
}).
Document Operations¶
%% Get document by ID
{ok, Doc} = barrel_vectordb:get(Store, <<"doc1">>).
%% Update document (requires embedder)
ok = barrel_vectordb:update(Store, <<"doc1">>, <<"New text">>, #{}).
%% Upsert (requires embedder)
ok = barrel_vectordb:upsert(Store, <<"doc1">>, <<"Text">>, #{}).
%% Delete
ok = barrel_vectordb:delete(Store, <<"doc1">>).
%% Count
N = barrel_vectordb:count(Store).
%% Checkpoint HNSW index (speeds up restart)
ok = barrel_vectordb:checkpoint(Store).
Configuration¶
barrel_vectordb:start_link(#{
name => my_store, %% Store name (required)
path => "/var/data/vectors", %% RocksDB path
dimensions => 768, %% Vector dimensions (default: 768)
backend => hnsw, %% Index backend: hnsw (default), faiss, or diskann
embedder => EmbedderConfig, %% Embedding provider (optional)
hnsw => #{ %% HNSW index parameters
m => 16,
ef_construction => 200
},
batch => #{ %% Write batching options
min_batch_size => 4,
max_batch_size => 256
}
}).
Search Options¶
| Option | Default | Description |
|---|---|---|
k |
5 | Number of results to return |
filter |
- | Function fun(Metadata) -> boolean() to filter results |
include_text |
true | Include text in results |
include_metadata |
true | Include metadata in results |
ef_search |
max(k, 50) | Search width (higher = better recall, slower) |
HNSW Parameters¶
| Parameter | Default | Description |
|---|---|---|
m |
16 | Max connections per node |
ef_construction |
200 | Build-time search width |
ef_search |
50 | Default query-time search width |
distance_fn |
cosine | cosine or euclidean |
Index Backends¶
HNSW (Default)¶
Pure Erlang HNSW implementation. No external dependencies.
{ok, _} = barrel_vectordb:start_link(#{
name => my_store,
path => "/tmp/vectors",
backend => hnsw
}).
FAISS¶
High-performance FAISS backend via barrel_faiss NIF.
{ok, _} = barrel_vectordb:start_link(#{
name => my_store,
path => "/tmp/vectors",
backend => faiss,
faiss => #{
index_type => <<"HNSW32">>,
distance_fn => cosine
}
}).
| Feature | HNSW | FAISS |
|---|---|---|
| Dependencies | None | barrel_faiss NIF |
| Insert speed | Baseline | 1.6-3x faster |
| Search speed | Baseline | 2x faster |
| Delete speed | Fast (native) | Slower (soft delete) |
DiskANN¶
SSD-optimized Vamana graph for billion-scale vector search with minimal memory.
{ok, _} = barrel_vectordb:start_link(#{
name => my_store,
path => "/tmp/vectors",
backend => diskann,
diskann => #{
r => 64, %% Max out-degree
l_build => 100, %% Build search width
l_search => 100, %% Query search width
storage_mode => disk, %% memory | disk
hot_enabled => true %% Enable hot layer for fast writes
}
}).
| Feature | HNSW | FAISS | DiskANN |
|---|---|---|---|
| Dependencies | None | barrel_faiss NIF | None |
| Memory usage | ~4KB/vector | Medium | ~530B/vector (disk mode) |
| Insert speed | Fast | 1.6-3x faster | Slower (batch optimized) |
| Search speed | ~0.25ms | 2x faster | ~1ms |
| Best for | Small-medium | GPU, batch queries | Large-scale, memory-constrained |
See DiskANN documentation for detailed configuration.
Next Steps¶
- Embedding Models - Configure embedding providers
- Clustering - Scale out with sharding
- HTTP API - REST API reference