如何在Searchkick.multi_search中使用with_highlights,解决调用报错问题
Searchkick multi_search 获取高亮结果方案
Searchkick 自带的with_highlights方法仅支持单次搜索返回的Searchkick::Results类型对象。使用Searchkick.multi_search时,返回的Searchkick::Query实例、以及实例下的results属性(普通数组)均未封装该方法,因此直接调用会报undefined method错误,可按照以下步骤实现高亮获取:
- 第一步:构造批量查询时显式开启高亮配置,同时指定
execute: false避免查询提前执行
示例代码:# 构造多个查询,每个查询都单独传highlight配置,支持自定义高亮字段、前后标签等 queries = [ Product.search("搜索关键词", highlight: { fields: { name: {} }, pre_tags: ["<mark>"], post_tags: ["</mark>"] }, execute: false), Post.search("搜索关键词", highlight: { fields: { content: {} } }, execute: false) ] # 执行批量搜索 Searchkick.multi_search(queries) - 第二步:手动从每个查询的原始ES响应中提取高亮,和业务结果配对
Searchkick::Query实例的response属性存储了Elasticsearch返回的原始结果,高亮内容存储在response["hits"]["hits"]的每个命中项中,和results数组的顺序一一对应,按索引配对即可:queries.each do |query| es_hits = query.response.dig("hits", "hits") || [] # 遍历业务结果,绑定高亮内容 query.results.each_with_index do |record, index| highlight_content = es_hits.dig(index, "highlight") # 给当前记录动态添加实例方法存储高亮,可根据业务需求调整存储方式 record.define_singleton_method(:highlights) { highlight_content } end end - 后续使用:直接调用业务对象上的自定义
highlights方法即可获取高亮结果,和原生with_highlights的使用效果一致# 示例使用 queries.first.results.each do |product| puts "商品名高亮:#{product.highlights&.dig("name")&.first || product.name}" end
内容的提问来源于stack exchange,提问作者Ramon Marques
相关产品推荐
相关产品推荐

