From c1ebc2f91a1d447a1ffaebf9d01c11483084a9b3 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 2 Sep 2024 22:43:23 -0700 Subject: [PATCH] Added support for hybrid search --- lib/searchkick/query.rb | 6 +----- test/hybrid_test.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 test/hybrid_test.rb diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index 277cfec5..8fcf1f41 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -529,14 +529,10 @@ def prepare # knn knn = options[:knn] if knn - if term != "*" - raise ArgumentError, "Hybrid search not supported yet" - end - field = knn[:field] vector = knn[:vector] k = per_page + offset - filter = payload.delete(:query) + filter = term == "*" ? payload.delete(:query) : payload[:query] if Searchkick.opensearch? payload[:query] = { diff --git a/test/hybrid_test.rb b/test/hybrid_test.rb new file mode 100644 index 00000000..08f11670 --- /dev/null +++ b/test/hybrid_test.rb @@ -0,0 +1,17 @@ +require_relative "test_helper" + +class HybridTest < Minitest::Test + def setup + skip unless Searchkick.knn_support? + super + end + + def test_basic + store [ + {name: "Product A", embedding: [1, 2, 3]}, + {name: "Item B", embedding: [1, 2, 3]}, + {name: "Product C", embedding: [-1, -2, -3]} + ] + assert_order "product", ["Product A", "Product C"], knn: {field: :embedding, vector: [1, 2, 3]} + end +end