Как получить связанное название модели в результатах поиска с помощью seachkick

Я использовал gem 'searchkick' для поиска в своем приложении.

вот моя ассоциация и настройки searchkick.

продукт.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

это аналогичная функциональность любого приложения электронной коммерции, например, если я ищу iPhone 7 в приложении Flipkart, он покажет iPhone 7 как категорию в результатах поиска, если я нажму на это, все продукты, связанные с iPhone 7, будут отображаться на одной странице.

я не знаю, как этого добиться, любая помощь будет оценена.


person Vishal    schedule 16.01.2018    source источник


Ответы (2)


Я думаю, вы ищете функцию агрегации. Просто посмотрите документ searchkick, и вы найдете ответ.

Примечание. Я даю ответ из приложения Stackoverflow. Поэтому позже я обновлю его кодом с ноутбука.

person Lalit Kumar Maurya    schedule 22.01.2018
comment
Спасибо за ваш ответ, но мне нужно многократный поиск, и я решил проблему. пожалуйста, проверьте мой ответ. - person Vishal; 23.01.2018

Мне нужно выполнить множественный поиск. Вот сервис, который я сделал для получения связанной модели с множественным поиском.

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

Источник здесь

person Vishal    schedule 23.01.2018