From a72f58056c469ba413a9040a56906bb25cbfddcf Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Sun, 14 Feb 2016 23:18:29 -0500 Subject: [PATCH] Added multi search --- lib/searchkick.rb | 10 ++++++++++ lib/searchkick/query.rb | 2 +- test/multi_search_test.rb | 13 +++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 test/multi_search_test.rb diff --git a/lib/searchkick.rb b/lib/searchkick.rb index 5f63da8..fdf4ddc 100644 --- a/lib/searchkick.rb +++ b/lib/searchkick.rb @@ -138,6 +138,16 @@ module Searchkick query.execute end end + + def self.multi_search(queries) + if queries.any? + responses = client.msearch(body: queries.flat_map { |q| [q.params.except(:body), q.body] })["responses"] + queries.each_with_index do |query, i| + query.send(:handle_response, responses[i]) + end + end + true + end end # TODO find better ActiveModel hook diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index a219618..c00ed70 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -129,7 +129,7 @@ module Searchkick match_suffix: @match_suffix, highlighted_fields: @highlighted_fields || [] } - Searchkick::Results.new(searchkick_klass, response, opts) + @execute = Searchkick::Results.new(searchkick_klass, response, opts) end def reindex_command diff --git a/test/multi_search_test.rb b/test/multi_search_test.rb new file mode 100644 index 0000000..b46cfbb --- /dev/null +++ b/test/multi_search_test.rb @@ -0,0 +1,13 @@ +require_relative "test_helper" + +class MultiSearchTest < Minitest::Test + def test_basic + store_names ["Product A"] + store_names ["Store A"], Store + products = Product.search("*", execute: false) + stores = Store.search("*", execute: false) + Searchkick.multi_search([products, stores]) + assert_equal ["Product A"], products.map(&:name) + assert_equal ["Store A"], stores.map(&:name) + end +end -- libgit2 0.21.0