@@ -4,6 +4,9 @@ class KnnTest < Minitest::Test
4
4
def setup
5
5
skip unless Searchkick . knn_support?
6
6
super
7
+
8
+ # prevent null_pointer_exception with OpenSearch 3.0.0-alpha1
9
+ Product . reindex if Searchkick . opensearch? && !Searchkick . server_below? ( "3.0.0" , true )
7
10
end
8
11
9
12
def test_basic
@@ -76,19 +79,19 @@ def test_euclidean
76
79
end
77
80
78
81
def test_euclidean_exact
79
- store [ { name : "A" , embedding : [ 1 , 2 , 3 ] } , { name : "B" , embedding : [ 1 , 5 , 7 ] } , { name : "C" } ]
80
- assert_order "*" , [ "A" , "B" ] , knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "euclidean" }
82
+ store [ { name : "A" , embedding2 : [ 1 , 2 , 3 ] } , { name : "B" , embedding2 : [ 1 , 5 , 7 ] } , { name : "C" } ]
83
+ assert_order "*" , [ "A" , "B" ] , knn : { field : :embedding2 , vector : [ 1 , 2 , 3 ] , distance : "euclidean" }
81
84
82
- scores = Product . search ( knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "euclidean" } ) . hits . map { |v | v [ "_score" ] }
85
+ scores = Product . search ( knn : { field : :embedding2 , vector : [ 1 , 2 , 3 ] , distance : "euclidean" } ) . hits . map { |v | v [ "_score" ] }
83
86
assert_in_delta 1.0 / ( 1 + 0 ) , scores [ 0 ]
84
87
assert_in_delta 1.0 / ( 1 + 5 **2 ) , scores [ 1 ]
85
88
end
86
89
87
90
def test_taxicab_exact
88
- store [ { name : "A" , embedding : [ 1 , 2 , 3 ] } , { name : "B" , embedding : [ 1 , 5 , 7 ] } , { name : "C" } ]
89
- assert_order "*" , [ "A" , "B" ] , knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "taxicab" }
91
+ store [ { name : "A" , embedding2 : [ 1 , 2 , 3 ] } , { name : "B" , embedding2 : [ 1 , 5 , 7 ] } , { name : "C" } ]
92
+ assert_order "*" , [ "A" , "B" ] , knn : { field : :embedding2 , vector : [ 1 , 2 , 3 ] , distance : "taxicab" }
90
93
91
- scores = Product . search ( knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "taxicab" } ) . hits . map { |v | v [ "_score" ] }
94
+ scores = Product . search ( knn : { field : :embedding2 , vector : [ 1 , 2 , 3 ] , distance : "taxicab" } ) . hits . map { |v | v [ "_score" ] }
92
95
assert_in_delta 1.0 / ( 1 + 0 ) , scores [ 0 ]
93
96
assert_in_delta 1.0 / ( 1 + 7 ) , scores [ 1 ]
94
97
end
@@ -116,10 +119,10 @@ def test_inner_product
116
119
end
117
120
118
121
def test_inner_product_exact
119
- store [ { name : "A" , embedding : [ -1 , -2 , -3 ] } , { name : "B" , embedding : [ 1 , 5 , 7 ] } , { name : "C" } ]
120
- assert_order "*" , [ "B" , "A" ] , knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "inner_product" }
122
+ store [ { name : "A" , embedding3 : [ -1 , -2 , -3 ] } , { name : "B" , embedding3 : [ 1 , 5 , 7 ] } , { name : "C" } ]
123
+ assert_order "*" , [ "B" , "A" ] , knn : { field : :embedding3 , vector : [ 1 , 2 , 3 ] , distance : "inner_product" }
121
124
122
- scores = Product . search ( knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "inner_product" } ) . hits . map { |v | v [ "_score" ] }
125
+ scores = Product . search ( knn : { field : :embedding3 , vector : [ 1 , 2 , 3 ] , distance : "inner_product" } ) . hits . map { |v | v [ "_score" ] }
123
126
assert_in_delta 1 + 32 , scores [ 0 ]
124
127
assert_in_delta 1.0 / ( 1 + 14 ) , scores [ 1 ]
125
128
end
@@ -148,15 +151,25 @@ def test_unindexed
148
151
Product . search ( knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "euclidean" , exact : false } )
149
152
end
150
153
assert_equal "distance must match searchkick options for approximate search" , error . message
154
+
155
+ if !Searchkick . server_below? ( "9.0.0" )
156
+ error = assert_raises ( ArgumentError ) do
157
+ Product . search ( knn : { field : :embedding , vector : [ 1 , 2 , 3 ] , distance : "euclidean" } )
158
+ end
159
+ assert_equal "distance must match searchkick options" , error . message
160
+ end
151
161
end
152
162
153
163
def test_explain
154
164
store [ { name : "A" , embedding : [ 1 , 2 , 3 ] , embedding2 : [ 1 , 2 , 3 ] , embedding3 : [ 1 , 2 , 3 ] , embedding4 : [ 1 , 2 , 3 ] } ]
155
165
156
166
assert_approx true , :embedding , "cosine"
157
- assert_approx false , :embedding , "euclidean"
158
- assert_approx false , :embedding , "inner_product"
159
- assert_approx false , :embedding , "taxicab"
167
+
168
+ if Searchkick . opensearch? || Searchkick . server_below? ( "9.0.0" )
169
+ assert_approx false , :embedding , "euclidean"
170
+ assert_approx false , :embedding , "inner_product"
171
+ assert_approx false , :embedding , "taxicab"
172
+ end
160
173
161
174
if Searchkick . opensearch?
162
175
assert_approx false , :embedding , "chebyshev"
0 commit comments