如何使用seachkick在搜索结果中获取关联的模型名称

时间:2018-01-16 07:11:47

标签: ruby-on-rails elasticsearch searchkick

我使用gem 'searchkick'在我的应用程序中进行搜索。

这是我的关联和searchkick设置。

product.rb

belongs_to :sub_category
belongs_to :brand
belongs_to :product_type
has_one :category, through: :sub_category


searchkick match: :word_start,word_start: [:name], suggest: [:name]
  scope :search_import, -> { includes(:brand, :sub_category, :category, :product_type) }

def search_data
  {
    name: name,
    category_name: category.name,
    sub_category_name: sub_category.name,
    brand: brand.name,
    product_type: product_type.name
  }
end

我不知道searchkick究竟是如何工作的。但我想在搜索结果中显示类别名称,子类别名称和产品类型名称。

例如,

我有醇类产品清单,属于啤酒,葡萄酒,威士忌等不同类别。

如果我搜索啤酒,它应该在搜索结果中显示啤酒,因为啤酒是与产品相关的类别。我不想要与啤酒类别相关的产品,我想在搜索结果中使用啤酒类别。

这是我对搜索查询的查询

response =  Product.search( params[:query], suggest: true, fields: ["name^10", "description"], limit: 5, operator: "or",misspellings: {below: 5} ).results

它是任何电子商务应用程序的类似功能,如果我在flipkart应用程序中搜索iPhone 7它将在搜索结果中显示iPhone 7作为类别,如果我点击所有与iPhone 7相关的产品将显示在一页。

我不知道如何实现这一目标,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找聚合功能。只需查看searchkick文档,您就会找到答案。

注意:我从Stackoverflow应用程序给出答案。所以我稍后会用笔记本电脑的一些代码更新它。

答案 1 :(得分:0)

我必须进行多重搜索,这是我为获取多重搜索关联模型所做的服务。

module Search
  class RetriveData
   def self.multi_search(params)
     @params = params
     create_searchable_variables_for_multi_model_search
     Searchkick.multi_search(array_of_searchkick_objects)
     array_of_searchkick_objects.map(&:results).flatten
   end

  private

  def self.array_of_searchkick_objects
    array_of_models.map do |klass|
      instance_variable_get("@#{klass.to_s.downcase}s")
    end
  end

  def self.searchable_fields
    ["name^10","sub_category_name","keyword_name",
     "category_name","product_type_name","brand_name"]
  end

  def self.create_searchable_variables_for_multi_model_search
    array_of_models.each do |klass|
      instance_variable_set("@#{klass.to_s.downcase}s",
                            klass.search( @params[:query], 
      constraints(klass) ))
    end
  end

  def self.constraints(klass)
    {
      fields: searchable_fields,
      suggest: true,
      operator: "or",
      misspellings: {below: 5},
      where: klass == Product ? { or: [[{available_cities_name: 
             @params[:city]},{available_cities_short_name: 
             @params[:short_name]}]] } : {},
      execute: false
    }
  end

  def self.array_of_models
    [Category, SubCategory, Brand, ProductType, Product]
  end
 end
end

来源为here