Skip to content

Commit bb72570

Browse files
committed
Added ef_search to knn search option
1 parent cb55c1c commit bb72570

3 files changed

Lines changed: 12 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## 5.5.0 (unreleased)
22

3-
- Added `m` and `ef_construction` options to `knn`
3+
- Added `m` and `ef_construction` to `knn` index option
4+
- Added `ef_search` to `knn` search option
45
- Fixed exact cosine distance for OpenSearch 2.19+
56
- Dropped support for Ruby < 3.2 and Active Record < 7.1
67
- Dropped support for Mongoid < 8

lib/searchkick/query.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,7 @@ def set_knn(payload, knn, per_page, offset)
891891
exact = knn[:exact]
892892
exact = field_options[:distance].nil? || distance != field_options[:distance] if exact.nil?
893893
k = per_page + offset
894+
ef_search = knn[:ef_search]
894895
filter = payload.delete(:query)
895896

896897
if distance.nil?
@@ -944,7 +945,7 @@ def set_knn(payload, knn, per_page, offset)
944945
vector: vector,
945946
k: k,
946947
filter: filter
947-
}
948+
}.merge(ef_search ? {method_parameters: {ef_search: ef_search}} : {})
948949
}
949950
}
950951
end
@@ -992,7 +993,7 @@ def set_knn(payload, knn, per_page, offset)
992993
query_vector: vector,
993994
k: k,
994995
filter: filter
995-
}
996+
}.merge(ef_search ? {num_candidates: ef_search} : {})
996997
end
997998
end
998999
end

test/knn_test.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,13 @@ def test_explain
198198
assert_equal "distance must match searchkick options for approximate search", error.message
199199
end
200200

201+
def test_ef_search
202+
skip if Searchkick.opensearch? && Searchkick.server_below?("2.16.0", true)
203+
204+
store [{name: "A", embedding: [1, 2, 3]}, {name: "B", embedding: [-1, -2, -3]}, {name: "C"}]
205+
assert_order "*", ["A", "B"], knn: {field: :embedding, vector: [1, 2, 3], ef_search: 20}, limit: 10
206+
end
207+
201208
private
202209

203210
def assert_approx(approx, field, distance, **knn_options)

0 commit comments

Comments
 (0)