Commit 951ee8fe by Thai Ha

fixed solr service add facet,....

parent 78a9beae
...@@ -5,6 +5,7 @@ class ApplicationController < ActionController::Base ...@@ -5,6 +5,7 @@ class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller? before_action :configure_permitted_parameters, if: :devise_controller?
protected protected
def configure_permitted_parameters def configure_permitted_parameters
...@@ -20,4 +21,8 @@ class ApplicationController < ActionController::Base ...@@ -20,4 +21,8 @@ class ApplicationController < ActionController::Base
redirect_to new_user_session_path redirect_to new_user_session_path
end end
end end
def salary_search
@salary_range = [0, 3_000_000, 7_000_000, 10_000_000, 15_000_000, 20_000_000, 30_000_000]
end
end end
class CitiesController < ApplicationController class CitiesController < ApplicationController
def index def index
solr = Solr.new
@regions = City.regions.keys @regions = City.regions.keys
@job_quantity_by_region = City.job_quantity_by_region @job_quantity_by_region = solr.facet_query('city_id')
end end
end end
class IndustriesController < ApplicationController class IndustriesController < ApplicationController
def index def index
@job_quantity_by_industry = Industry.job_quantity_by_industry solr = Solr.new
@job_quantity_by_industry = solr.facet_query('industry_id')
end end
end end
class JobsController < ApplicationController class JobsController < ApplicationController
before_action :history, only: :show before_action :history, only: :show
before_action :salary_search
def index def index
@search = params @search = params
...@@ -34,8 +35,8 @@ class JobsController < ApplicationController ...@@ -34,8 +35,8 @@ class JobsController < ApplicationController
end end
def get_jobs(query) def get_jobs(query)
jobs_ids = query['docs'].map { |j| j['job_id'] } jobs_ids = query['response']['docs'].map { |j| j['job_id'] }
@jobs = Job.includes(:cities, :cities_jobs, :company).find(jobs_ids) @jobs = Job.eager_load(:cities, :cities_jobs, :company).find(jobs_ids)
@jobs_count = query['numFound'] @jobs_count = query['numFound']
end end
end end
class TopController < ApplicationController class TopController < ApplicationController
before_action :salary_search
def index def index
@total_job = Job.count @total_job = Job.count
@latest_jobs = Job.sort_by_date(per_page: Job::LATEST_JOBS_LIMIT) @latest_jobs = Job.sort_by_date(per_page: Job::LATEST_JOBS_LIMIT)
......
...@@ -26,9 +26,22 @@ module ApplicationHelper ...@@ -26,9 +26,22 @@ module ApplicationHelper
def view_search_result def view_search_result
if params[:search].blank? if params[:search].blank?
if params[:salary].to_i.zero?
@name.to_s @name.to_s
else else
"Totals #{@jobs_count} jobs"
end
else
"Totals #{@jobs_count} result for #{params[:search]} in #{@name}" "Totals #{@jobs_count} result for #{params[:search]} in #{@name}"
end end
end end
def vnd_format(num)
if num.zero?
'Tất cả'
else
num_groups = num.to_s.chars.to_a.reverse.each_slice(3)
"Từ #{num_groups.map(&:join).join('.').reverse} đ"
end
end
end end
class Solr class Solr
def initialize(params = { search: '*:*' }) def initialize(params = { search: '*:*' })
@solr = RSolr.connect(url: 'http://192.168.1.8:8983/solr/VenJob/') @solr = RSolr.connect(url: 'http://localhost:8983/solr/VenJob/')
@params = params @params = params
end end
...@@ -14,14 +14,15 @@ class Solr ...@@ -14,14 +14,15 @@ class Solr
job_level: job.position, job_level: job.position,
min_salary: job.min_salary, min_salary: job.min_salary,
max_salary: job.max_salary, max_salary: job.max_salary,
cities_name: job.cities.map { |c| c.name.gsub(' / ', ', ') }, cities_name: job.cities.map(&:name),
city_id: job.cities&.ids, city_id: job.cities&.ids,
industries_name: job.industries.map { |i| i.name.gsub(' / ', ', ') }, industries_name: job.industries.map(&:name),
industry_id: job.industries&.ids industry_id: job.industries&.ids
} }
end end
jobs_index.each do |add_jobs| jobs_index.each do |add_jobs|
# byebug
@solr.add(add_jobs) @solr.add(add_jobs)
rescue Exception rescue Exception
next next
...@@ -38,8 +39,11 @@ class Solr ...@@ -38,8 +39,11 @@ class Solr
def query_all def query_all
q = "search:*#{@params[:search]}*" q = "search:*#{@params[:search]}*"
fq = '' fq = if @params[:salary]
"min_salary: [#{@params[:salary]} TO *]"
else
''
end
send_request(q, fq) send_request(q, fq)
end end
...@@ -50,7 +54,11 @@ class Solr ...@@ -50,7 +54,11 @@ class Solr
city_name = city.name city_name = city.name
q = "search:*#{@params[:search]}*" q = "search:*#{@params[:search]}*"
fq = "cities_name: \"#{escape_str(city_name)}\"" fq = if @params[:salary]
["cities_name: \"#{escape_str(city_name)}\"", "min_salary: [#{@params[:salary]} TO *]"]
else
"cities_name: \"#{escape_str(city_name)}\""
end
send_request(q, fq) send_request(q, fq)
end end
...@@ -62,21 +70,49 @@ class Solr ...@@ -62,21 +70,49 @@ class Solr
industry_name = industry.name industry_name = industry.name
q = "search:*#{@params[:search]}*" q = "search:*#{@params[:search]}*"
fq = "industries_name: \"#{escape_str(industry_name)}\"" fq = if @params[:salary]
["industries_name: \"#{escape_str(industry_name)}\"", "min_salary: [#{@params[:salary]} TO *]"]
else
"industries_name: \"#{escape_str(industry_name)}\""
end
send_request(q, fq) send_request(q, fq)
end end
def send_request(q_param, fq_param) def facet_query(facet_param)
response = @solr.get 'select', params: { q = '*:*'
q: q_param, fq = '*:*'
fq: fq_param, facet = facet_param
rows: Job.count response = send_request(q, fq, facet)
query = response['facet_counts']['facet_fields'][facet]
ids = query.each_slice(2).map { |a, _| a }
jobs_count = query.each_slice(2).map { |_, b| b }
return city_handle(ids, jobs_count) if facet == 'city_id'
return industry_handle(ids, jobs_count) if facet == 'industry_id'
end
def send_request(q_param, fq_param, facet_param = nil)
@solr.get 'select', params: {
'facet': true,
'facet.field': facet_param,
'q': q_param,
'fq': fq_param,
'rows': Job.count
} }
response['response']
end end
def escape_str(str) def escape_str(str)
RSolr.solr_escape(str) RSolr.solr_escape(str)
end end
def city_handle(ids, jobs_count)
city = City.find(ids).map { |c| [c.region, c.name, c.slug] }
city_count = city.zip(jobs_count).flatten.compact.each_slice(4).map { |c| c }
city_count.group_by(&:shift)
end
def industry_handle(ids, jobs_count)
industry = Industry.find(ids).map { |i| [i.name, i.slug] }
industry.zip(jobs_count).flatten.compact.each_slice(3).map { |c| c }
end
end end
...@@ -18,9 +18,9 @@ ...@@ -18,9 +18,9 @@
= region.upcase = region.upcase
hr.my-4 hr.my-4
.row .row
- city_job_count.each do |city, count| - city_job_count.each do |city|
.col-lg-4.col-md-6.text-center .col-lg-4.col-md-6.text-center
.mt-5 .mt-5
.city-item .city-item
h3.h4.mb-2.see-more-text= link_to city[0], city_jobs_path(city_slug: city[1]) , class:'text-decoration-none fw-normal text-reset' h3.h4.mb-2.see-more-text= link_to city[0], city_jobs_path(city_slug: city[1]) , class:'text-decoration-none fw-normal text-reset'
p.text-muted.mb-0= pluralize(count, 'job') p.text-muted.mb-0= pluralize(city[2], 'job')
\ No newline at end of file \ No newline at end of file
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
h2.mt-0 INDUSTRIES h2.mt-0 INDUSTRIES
hr.my-4 hr.my-4
#info-box.row #info-box.row
- @job_quantity_by_industry.each do |name, job_count| - @job_quantity_by_industry.each do |industry|
.col-lg-6.col-md-6.text-center .col-lg-6.col-md-6.text-center
.mt-5 .mt-5
h3.h4.mb-2.see-more-text= link_to name[0], industry_jobs_path(industry_slug: name[1]) , class:'text-decoration-none fw-normal text-reset' h3.h4.mb-2.see-more-text= link_to industry[0], industry_jobs_path(industry_slug: industry[1]) , class:'text-decoration-none fw-normal text-reset'
p.text-muted.mb-0= pluralize(job_count, 'job') p.text-muted.mb-0= pluralize(industry[2], 'job')
hr.divider.my-4 hr.divider.my-4
...@@ -3,22 +3,38 @@ ...@@ -3,22 +3,38 @@
-if params[:city_slug] -if params[:city_slug]
= form_tag(city_jobs_path(city_slug: params[:city_slug]), method: :get, class: "form-inline") do = form_tag(city_jobs_path(city_slug: params[:city_slug]), method: :get, class: "form-inline") do
.row .row
.col-md-10.mb-md-0.no-padding .col-md-8.mb-md-0.no-padding
= search_field_tag :search, params[:search], placeholder: 'Find a job in this location', class: 'form-control rounded-left no-border-radius bg-light h-100' = search_field_tag :search, params[:search], placeholder: 'Find a job (name, company, position)', class: 'form-control rounded-left no-border-radius bg-light h-100'
.col-md-2.mb-md-0.no-padding
= select_tag(:salary,
options_for_select( @salary_range.collect {|s| [vnd_format(s), s]},
params[:salary] ),
class:"form-select bg-light h-100")
.col-md-2.mb-md-0.no-padding .col-md-2.mb-md-0.no-padding
= submit_tag "Search", class: "h-100 w-100 btn btn-block btn-lg btn-info" = submit_tag "Search", class: "h-100 w-100 btn btn-block btn-lg btn-info"
-elsif params[:industry_slug] -elsif params[:industry_slug]
= form_tag(industry_jobs_path(industry_slug: params[:industry_slug]), method: :get, class: "form-inline") do = form_tag(industry_jobs_path(industry_slug: params[:industry_slug]), method: :get, class: "form-inline") do
.row .row
.col-md-10.mb-md-0.no-padding .col-md-8.mb-md-0.no-padding
= search_field_tag :search, params[:search], placeholder: 'Find a job in this industy', class: 'form-control rounded-left no-border-radius bg-light h-100' = search_field_tag :search, params[:search], placeholder: 'Find a job (name, company, position)', class: 'form-control rounded-left no-border-radius bg-light h-100'
.col-md-2.mb-md-0.no-padding
= select_tag(:salary,
options_for_select( @salary_range.collect {|s| [vnd_format(s), s]},
params[:salary] ),
class:"form-select bg-light h-100")
.col-md-2.mb-md-0.no-padding .col-md-2.mb-md-0.no-padding
= submit_tag "Search", class: "h-100 w-100 btn btn-block btn-lg btn-info" = submit_tag "Search", class: "h-100 w-100 btn btn-block btn-lg btn-info"
- else - else
= form_tag(jobs_path, method: :get, class: "form-inline") do = form_tag(jobs_path, method: :get, class: "form-inline") do
.row .row
.col-md-10.mb-md-0.no-padding .col-md-8.mb-md-0.no-padding
= search_field_tag :search, params[:search], placeholder: 'Find a job (name, company, position)', class: 'form-control rounded-left no-border-radius bg-light h-100' = search_field_tag :search, params[:search], placeholder: 'Find a job (name, company, position)', class: 'form-control rounded-left no-border-radius bg-light h-100'
.col-md-2.mb-md-0.no-padding .col-md-2.mb-md-0.no-padding
= select_tag(:salary,
options_for_select( @salary_range.collect {|s| [vnd_format(s), s]},
params[:salary] ),
class:"form-select bg-light h-100")
.col-md-2.mb-md-0.no-padding
= submit_tag "Search", class: "h-100 w-100 btn btn-block btn-lg btn-info" = submit_tag "Search", class: "h-100 w-100 btn btn-block btn-lg btn-info"
\ No newline at end of file
...@@ -64,7 +64,7 @@ namespace :crawler do ...@@ -64,7 +64,7 @@ namespace :crawler do
end end
# salary # salary
if salary.include?('USD') if salary.include?('USD')
parsed = parse_salary(salary.remove('USD'), 23_000) parsed = parse_salary(salary.remove('USD', ','), 23_000)
if parsed.length == 1 if parsed.length == 1
min_salary = parsed[0] min_salary = parsed[0]
max_salary = parsed[0] max_salary = parsed[0]
......
From: /home/hamht/ThaiHa/VenJob/app/controllers/jobs_controller.rb:21 JobsController#index:
5: def index
6: @search = params
7: solr = Solr.new(@search)
8: if params[:city_slug]
9: jobs_query = solr.query_by_city
10: @name = City.find_by(slug: params[:city_slug]).name
11: elsif params[:industry_slug]
12: jobs_query = solr.query_by_industry
13: @name = Industry.find_by(slug: params[:industry_slug]).name
14: else
15: jobs_query = solr.query_all
16: @name = 'Jobs'
17: end
18:
19: get_jobs(jobs_query)
20: @jobs = Kaminari.paginate_array(@jobs).page(params[:page]).per(Job::JOB_PER_PAGE)
=> 21: binding.pry
22: end
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