Как получить ассоциированное название модели в результатах поиска с помощью seachkick
Я использовал gem '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
это аналогичный функционал любого приложения электронной коммерции, например, если я ищу iPhone 7
в приложении флипкарта в результатах поиска будет отображаться iPhone 7 как категория, если я нажму, что все продукты, связанные с iPhone 7, будут отображаться на одной странице.
Я не знаю, как этого добиться, любая помощь будет оценена.
2 ответа
Я думаю, что вы ищете функцию агрегации. Просто посмотрите документацию по поиску, и вы найдете ответ.
Примечание: я даю ответ из приложения Stackr u. Поэтому позже я обновлю его с помощью некоторого кода с ноутбука.
Я должен сделать мульти поиск, вот сервис, который я сделал для получения связанной модели с мульти поиском.
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
Источник здесь