pgvector support for Ruby
182
stars
168
commits
Ruby
primary language
Jul 9, 2026
updated
pgvector support for Ruby
For Rails, check out Neighbor
Add this line to your application’s Gemfile:
gem "pgvector"
And follow the instructions for your database library:
Or check out some examples:
COPYEnable the extension
conn.exec("CREATE EXTENSION IF NOT EXISTS vector")
Optionally enable type casting for results
registry = PG::BasicTypeRegistry.new.define_default_types
Pgvector::PG.register_vector(registry)
conn.type_map_for_results = PG::BasicTypeMapForResults.new(conn, registry: registry)
Create a table
conn.exec("CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3))")
Insert a vector
embedding = [1, 2, 3]
conn.exec_params("INSERT INTO items (embedding) VALUES ($1)", [embedding])
Get the nearest neighbors to a vector
conn.exec_params("SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5", [embedding]).to_a
Add an approximate index
conn.exec("CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)")
# or
conn.exec("CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)")
Use vector_ip_ops for inner product and vector_cosine_ops for cosine distance
Enable the extension
DB.run("CREATE EXTENSION IF NOT EXISTS vector")
Create a table
DB.create_table :items do
primary_key :id
column :embedding, "vector(3)"
end
Add the plugin to your model
class Item < Sequel::Model
plugin :pgvector, :embedding
end
Insert a vector
Item.create(embedding: [1, 1, 1])
Get the nearest neighbors to a record
item.nearest_neighbors(:embedding, distance: "euclidean").limit(5)
Also supports inner_product, cosine, taxicab, hamming, and jaccard distance
Get the nearest neighbors to a vector
Item.nearest_neighbors(:embedding, [1, 1, 1], distance: "euclidean").limit(5)
Add an approximate index
DB.add_index :items, :embedding, type: "hnsw", opclass: "vector_l2_ops"
Use vector_ip_ops for inner product and vector_cosine_ops for cosine distance
Create a sparse vector from an array
vec = Pgvector::SparseVector.new([1, 0, 2, 0, 3, 0])
Or a hash of non-zero elements
vec = Pgvector::SparseVector.new({0 => 1, 2 => 2, 4 => 3}, 6)
Note: Indices start at 0
Get the number of dimensions
dim = vec.dimensions
Get the indices of non-zero elements
indices = vec.indices
Get the values of non-zero elements
values = vec.values
Get an array
arr = vec.to_a
View the changelog
Everyone is encouraged to help improve this project. Here are a few ways you can help:
To get started with development:
git clone https://github.com/pgvector/pgvector-ruby.git
cd pgvector-ruby
createdb pgvector_ruby_test
bundle install
bundle exec rake test
To run an example:
cd examples/loading
bundle install
createdb pgvector_example
bundle exec ruby example.rb
Ruby
100.0%
pgvector support for Ruby
182
stars
168
commits
Ruby
primary language
Jul 9, 2026
updated
pgvector support for Ruby
For Rails, check out Neighbor
Add this line to your application’s Gemfile:
gem "pgvector"
And follow the instructions for your database library:
Or check out some examples:
COPYEnable the extension
conn.exec("CREATE EXTENSION IF NOT EXISTS vector")
Optionally enable type casting for results
registry = PG::BasicTypeRegistry.new.define_default_types
Pgvector::PG.register_vector(registry)
conn.type_map_for_results = PG::BasicTypeMapForResults.new(conn, registry: registry)
Create a table
conn.exec("CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3))")
Insert a vector
embedding = [1, 2, 3]
conn.exec_params("INSERT INTO items (embedding) VALUES ($1)", [embedding])
Get the nearest neighbors to a vector
conn.exec_params("SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5", [embedding]).to_a
Add an approximate index
conn.exec("CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)")
# or
conn.exec("CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)")
Use vector_ip_ops for inner product and vector_cosine_ops for cosine distance
Enable the extension
DB.run("CREATE EXTENSION IF NOT EXISTS vector")
Create a table
DB.create_table :items do
primary_key :id
column :embedding, "vector(3)"
end
Add the plugin to your model
class Item < Sequel::Model
plugin :pgvector, :embedding
end
Insert a vector
Item.create(embedding: [1, 1, 1])
Get the nearest neighbors to a record
item.nearest_neighbors(:embedding, distance: "euclidean").limit(5)
Also supports inner_product, cosine, taxicab, hamming, and jaccard distance
Get the nearest neighbors to a vector
Item.nearest_neighbors(:embedding, [1, 1, 1], distance: "euclidean").limit(5)
Add an approximate index
DB.add_index :items, :embedding, type: "hnsw", opclass: "vector_l2_ops"
Use vector_ip_ops for inner product and vector_cosine_ops for cosine distance
Create a sparse vector from an array
vec = Pgvector::SparseVector.new([1, 0, 2, 0, 3, 0])
Or a hash of non-zero elements
vec = Pgvector::SparseVector.new({0 => 1, 2 => 2, 4 => 3}, 6)
Note: Indices start at 0
Get the number of dimensions
dim = vec.dimensions
Get the indices of non-zero elements
indices = vec.indices
Get the values of non-zero elements
values = vec.values
Get an array
arr = vec.to_a
View the changelog
Everyone is encouraged to help improve this project. Here are a few ways you can help:
To get started with development:
git clone https://github.com/pgvector/pgvector-ruby.git
cd pgvector-ruby
createdb pgvector_ruby_test
bundle install
bundle exec rake test
To run an example:
cd examples/loading
bundle install
createdb pgvector_example
bundle exec ruby example.rb
Ruby
100.0%