Configure SQLite with Vec1 or sqlite-vec
masterSQLite supports nearest neighbor search via extensions which improve performance.
Using Vec1:
- Build the extension.
- Initialize in
config/initializers/neighbor.rb:Neighbor::SQLite.initialize!(extension: "/path/to/vec1.so") - Use virtual tables in migrations (Rails 8+):
create_virtual_table :items, :vec1, ["embedding", "id"] - Query using SQL:
Item.find_by_sql("SELECT * FROM items(vec1_from_json(?), ?)", [[1, 2, 3].to_json, {k: 5}.to_json])
Using sqlite-vec:
- Add
gem "sqlite-vec"to your Gemfile. - Run
rails generate neighbor:sqlite. - Use virtual tables in migrations (Rails 8+):
create_virtual_table :items, :vec0, [ "id integer PRIMARY KEY AUTOINCREMENT NOT NULL", "embedding float[3] distance_metric=L2" ] - Query using ActiveRecord:
Item.where("embedding MATCH ?", [1, 2, 3].to_s).where(k: 5).order(:distance)
# sqlite-vec query example
Item.where("embedding MATCH ?", [1, 2, 3].to_s).where(k: 5).order(:distance)