You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:24:02