Commit e8423022 by Tran Hoang Viet

VietTH: Extend solr search with multi fields

parent ae61394c
......@@ -48,6 +48,7 @@ group :development, :test do
gem 'faker', '~> 1.4.3'
gem 'shoulda-matchers', '~> 2.8.0'
gem 'pry-byebug'
end
# template
......
......@@ -281,6 +281,9 @@ GEM
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-byebug (3.2.0)
byebug (~> 5.0)
pry (~> 0.10)
pry-rails (0.3.4)
pry (>= 0.9.10)
quiet_assets (1.1.0)
......@@ -455,6 +458,7 @@ DEPENDENCIES
meta-tags (~> 2.0.0)
mini_magick (~> 3.8.1)
mysql2
pry-byebug
pry-rails (~> 0.3.4)
quiet_assets
rails (= 4.2.3)
......
......@@ -188,3 +188,9 @@ footer{
margin-bottom: 0;
}
}
#search-info {
margin-top: -10px;
background-color: #F5F5F5;
padding: 20px;
}
\ No newline at end of file
......@@ -32,12 +32,6 @@ class ProductsController < ApplicationController
end
end
def search
query = params[:query].present? ? {title: params[:query]} : '*'
@products = Product.search(query, page: params[:page])
add_breadcrumb('Search result')
end
def meta_attributes
return if @product.blank?
......
class SearchController < ApplicationController
before_action :add_breadcrumb_home
def index
query = {}
query.merge!(title: params[:query]) if params[:query].present?
query.merge!(category_id: params[:category]) if params[:category].present?
unless params[:price_start].to_i.zero? && params[:price_end].to_i.zero?
query.merge!(price: {
value: params[:price_start].to_i..params[:price_end].to_i,
escape: false
})
end
@products = Product.search(query, page: params[:page])
@categories = @categories = Category.all.limit(Settings.limit_category)
add_breadcrumb('Search result')
end
end
\ No newline at end of file
......@@ -30,28 +30,41 @@ module Solr extend ActiveSupport::Concern
return unless query.is_a?(Hash)
@solr_options_data = solr_options_data.merge(options)
query = solr_handle_query(query)
results = rsolr.paginate(
solr_options_data[:page],
solr_options_data[:per_page],
'select',
params: {q: query, fl: self.primary_key}
)
@solr_options_data[:total_count] = results['response']['numFound'].to_i
parse(results['response'])
end
def solr_handle_query(query)
query = query.inject('') do |str, item|
if item.last.is_a?(Hash)
value = item.last[:value]
escape = item.last[:escape].nil? || item.last[:escape].present?
escape = item.last[:escape].present? || (item.last[:escape].nil? && solr_options_data[:escape].present?)
else
value = item.last
escape = solr_options_data[:escape].present?
end
value = solr_handle_value(value)
value = %Q("#{value}") if escape.present?
str << "#{item.first}:#{value}" << ' '
end
query
end
results = rsolr.paginate(
solr_options_data[:page],
solr_options_data[:per_page],
'select',
params: {q: query, fl: self.primary_key}
)
@solr_options_data[:total_count] = results['response']['numFound'].to_i
parse(results['response'])
def solr_handle_value(value)
if value.is_a?(Range)
"[#{value.first} TO #{value.last.zero? ? '*' : value.last}]"
else # String
value
end
end
def parse(results)
......
......@@ -18,5 +18,5 @@ class Product < ActiveRecord::Base
mount_uploader :image, ImageUploader
solr_options per_page: Settings.limit_category, fields: [:id, :title]
solr_options per_page: Settings.limit_category, fields: [:id, :title, :category_id, :price]
end
......@@ -29,9 +29,5 @@
= link_to 'Register', new_user_registration_path
.navbar-form.navbar-right
= form_tag search_products_path, method: :get do
.input-group
= text_field_tag :query, params[:query], class: 'form-control', placeholder: 'Search for title...'
%span.input-group-btn
%button.btn.btn-default{type: "submit"} Go!
= render 'layouts/search'
= form_tag search_index_path, method: :get do
.input-group
= text_field_tag :query, params[:query], class: 'form-control', placeholder: 'Search for title...'
%span.input-group-btn
%button.btn.btn-primary{type: "submit"}
Search
%i.fa.fa-search
= link_to search_index_path, class: 'btn btn-info' do
Advanced
%i.fa.fa-cog
\ No newline at end of file
......@@ -14,11 +14,7 @@
#wrapper.container-fluid
= render 'layouts/message'
.row
.col-md-6.search-wrapper
= render 'layouts/search'
.row
.col-md-12
.row.search-wrapper
= render 'layouts/breadcrumb'
#content.row
......
#search-info
= form_tag search_index_path, method: :get, class: 'form-horizontal' do
.form-group
= label :query, 'Product title: ', class: 'col-sm-2 control-label'
.col-sm-8
= text_field_tag :query, params[:query], class: 'form-control', placeholder: 'Search for title...'
.form-group
= label :query, 'Category: ', class: 'col-sm-2 control-label'
.col-sm-5
= select_tag :category, options_from_collection_for_select(@categories.decorate, :id, :title, params[:category]), {include_blank: '-- Select category --', class: 'form-control'}
.form-group
= label :query, 'Product price: ', class: 'col-sm-2 control-label'
.col-sm-2
.customize-spinner.input-group.spinner{"data-trigger" => "spinner"}
= text_field_tag :price_start, params[:price_start], data: {min: 0}, class: 'form-control'
.input-group-addon
%a.spin-up{"data-spin" => "up", href: "javascript:;"}
%i.fa.fa-sort-up
%a.spin-down{"data-spin" => "down", href: "javascript:;"}
%i.fa.fa-sort-down
.col-sm-1.text-center
%span ~
.col-sm-2
.customize-spinner.input-group.spinner{"data-trigger" => "spinner"}
= text_field_tag :price_end, params[:price_end], data: {min: 0}, class: 'form-control'
.input-group-addon
%a.spin-up{"data-spin" => "up", href: "javascript:;"}
%i.fa.fa-sort-up
%a.spin-down{"data-spin" => "down", href: "javascript:;"}
%i.fa.fa-sort-down
.form-group
.col-sm-4.col-sm-offset-2
= submit_tag 'Search', class: 'btn btn-primary'
%h3.title
Search result for:
= params[:query]
%h3.title Search
.module
- if @products.present?
= render 'form_search'
- if @products.present?
%h3.title Result
.module
#category-items.products-list-detail
= render @products
.pagination
......
......@@ -10,12 +10,10 @@ Rails.application.routes.draw do
member do
get :add_cart
end
collection do
get :search
end
end
resources :search
resources :categories
resources :orders do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment