@@ -4,6 +4,7 @@ defmodule Item do
4
4
schema "ecto_items" do
5
5
field :embedding , Pgvector.Ecto.Vector
6
6
field :half_embedding , Pgvector.Ecto.HalfVector
7
+ field :binary_embedding , Pgvector.Ecto.Bit
7
8
field :sparse_embedding , Pgvector.Ecto.SparseVector
8
9
end
9
10
end
@@ -17,15 +18,15 @@ defmodule EctoTest do
17
18
setup_all do
18
19
Ecto.Adapters.SQL . query! ( Repo , "CREATE EXTENSION IF NOT EXISTS vector" , [ ] )
19
20
Ecto.Adapters.SQL . query! ( Repo , "DROP TABLE IF EXISTS ecto_items" , [ ] )
20
- Ecto.Adapters.SQL . query! ( Repo , "CREATE TABLE ecto_items (id bigserial primary key, embedding vector(3), half_embedding halfvec(3), sparse_embedding sparsevec(3))" , [ ] )
21
+ Ecto.Adapters.SQL . query! ( Repo , "CREATE TABLE ecto_items (id bigserial primary key, embedding vector(3), half_embedding halfvec(3), binary_embedding bit(3), sparse_embedding sparsevec(3))" , [ ] )
21
22
create_items ( )
22
23
:ok
23
24
end
24
25
25
26
defp create_items do
26
- Repo . insert ( % Item { embedding: Pgvector . new ( [ 1 , 1 , 1 ] ) , half_embedding: Pgvector.HalfVector . new ( [ 1 , 1 , 1 ] ) , sparse_embedding: Pgvector.SparseVector . new ( [ 1 , 1 , 1 ] ) } )
27
- Repo . insert ( % Item { embedding: [ 2 , 2 , 3 ] , half_embedding: [ 2 , 2 , 3 ] , sparse_embedding: [ 2 , 2 , 3 ] } )
28
- Repo . insert ( % Item { embedding: Nx . tensor ( [ 1 , 1 , 2 ] , type: :f32 ) , half_embedding: Nx . tensor ( [ 1 , 1 , 2 ] , type: :f16 ) , sparse_embedding: Nx . tensor ( [ 1 , 1 , 2 ] , type: :f32 ) } )
27
+ Repo . insert ( % Item { embedding: Pgvector . new ( [ 1 , 1 , 1 ] ) , half_embedding: Pgvector.HalfVector . new ( [ 1 , 1 , 1 ] ) , binary_embedding: << 0 :: 1 , 0 :: 1 , 0 :: 1 >> , sparse_embedding: Pgvector.SparseVector . new ( [ 1 , 1 , 1 ] ) } )
28
+ Repo . insert ( % Item { embedding: [ 2 , 2 , 3 ] , half_embedding: [ 2 , 2 , 3 ] , binary_embedding: << 1 :: 1 , 0 :: 1 , 1 :: 1 >> , sparse_embedding: [ 2 , 2 , 3 ] } )
29
+ Repo . insert ( % Item { embedding: Nx . tensor ( [ 1 , 1 , 2 ] , type: :f32 ) , half_embedding: Nx . tensor ( [ 1 , 1 , 2 ] , type: :f16 ) , binary_embedding: << 1 :: 1 , 1 :: 1 , 1 :: 1 >> , sparse_embedding: Nx . tensor ( [ 1 , 1 , 2 ] , type: :f32 ) } )
29
30
end
30
31
31
32
test "vector l2 distance" do
@@ -80,6 +81,16 @@ defmodule EctoTest do
80
81
assert Enum . map ( items , fn v -> v . id end ) == [ 1 , 3 , 2 ]
81
82
end
82
83
84
+ test "bit hamming distance" do
85
+ items = Repo . all ( from i in Item , order_by: hamming_distance ( i . binary_embedding , << 1 :: 1 , 0 :: 1 , 1 :: 1 >> ) , limit: 5 )
86
+ assert Enum . map ( items , fn v -> v . id end ) == [ 2 , 3 , 1 ]
87
+ end
88
+
89
+ test "bit jaccard distance" do
90
+ items = Repo . all ( from i in Item , order_by: jaccard_distance ( i . binary_embedding , << 1 :: 1 , 0 :: 1 , 1 :: 1 >> ) , limit: 5 )
91
+ assert Enum . map ( items , fn v -> v . id end ) == [ 2 , 3 , 1 ]
92
+ end
93
+
83
94
test "sparsevec l2 distance" do
84
95
items = Repo . all ( from i in Item , order_by: l2_distance ( i . sparse_embedding , Pgvector.SparseVector . new ( [ 1 , 1 , 1 ] ) ) , limit: 5 )
85
96
assert Enum . map ( items , fn v -> v . id end ) == [ 1 , 3 , 2 ]
0 commit comments