如何将 `Searchkick.multi_search` 与 `with_highlights` 一起使用?未定义的方法`with_highlights'

How to use `Searchkick.multi_search` along with `with_highlights`? undefined method `with_highlights'

我们正在尝试通过进行单个批量搜索来优化我们的搜索请求,因此我们正在尝试使用 Searchkick.multi_search。但是,它仅 returns Searchkick::Query 将结果填充在 results 属性中,作为常规 Array.

然后,现在如果我尝试 results.with_highlights... 它会失败

undefined method `with_highlights' for #<Array:0x000055a82a7440f0>

或者如果我尝试 search_query.with_highlights 它会失败

undefined method `with_highlights' for #<Searchkick::Query:0x00007f47c5d0cde8>

如何在使用multi_search时获取高光?

Searchkick 4.6.1+

的更新答案

在此处 https://github.com/ankane/searchkick/pull/1518 与 Searchkick 的 Ankane 进行了交谈。他最终发布了一个修复此问题的新版本,然后此处的原始答案仅对 Searchkick 版本 4.6.0 有效。

对于 4.6.1+ 只需执行:

  groups = Group.search(query, execute: false)
  users = User.search(query, execute: false)

  Searchkick.multi_search([groups, users])

  highlighted_groups_results = groups.with_highlights(...
  ...

4.6.0 的原始答案-

知道了!

深入研究 Searchkick 代码库并检查 Searchkick::Query 实现后,发现 execute 方法正是我所需要的。

def execute
    @execute ||= begin
                     begin
                       response = execute_search
                       if retry_misspellings?(response)
                         prepare
                         response = execute_search
                       end
                     rescue => e # TODO rescue type
                       handle_error(e)
                     end
                     handle_response(response)
                   end
end

https://github.com/ankane/searchkick/blob/230ec8eb996ae93af4dc7686e02555d995ba1870/lib/searchkick/query.rb#L101

handle_response(response) 正是我们使 with_highlights 工作所需要的。

然后我的最终实现如下所示:

groups = Group.search(query, execute: false)
users = User.search(query, execute: false)

Searchkick.multi_search([groups, users])

# execute here won't do any additional requests as it's already cached in an instance variable @execute
highlighted_groups_results = groups.execute.with_highlights(...
...