Commit 951ee8fe by Thai Ha

fixed solr service add facet,....

parent 78a9beae
......@@ -5,6 +5,7 @@ class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
......@@ -20,4 +21,8 @@ class ApplicationController < ActionController::Base
redirect_to new_user_session_path
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
class CitiesController < ApplicationController
def index
solr = Solr.new
@regions = City.regions.keys
@job_quantity_by_region = City.job_quantity_by_region
@job_quantity_by_region = solr.facet_query('city_id')
end
end
class IndustriesController < ApplicationController
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
class JobsController < ApplicationController
before_action :history, only: :show
before_action :salary_search
def index
@search = params
......@@ -34,8 +35,8 @@ class JobsController < ApplicationController
end
def get_jobs(query)
jobs_ids = query['docs'].map { |j| j['job_id'] }
@jobs = Job.includes(:cities, :cities_jobs, :company).find(jobs_ids)
jobs_ids = query['response']['docs'].map { |j| j['job_id'] }
@jobs = Job.eager_load(:cities, :cities_jobs, :company).find(jobs_ids)
@jobs_count = query['numFound']
end
end
class TopController < ApplicationController
before_action :salary_search
def index
@total_job = Job.count
@latest_jobs = Job.sort_by_date(per_page: Job::LATEST_JOBS_LIMIT)
......
......@@ -26,9 +26,22 @@ module ApplicationHelper
def view_search_result
if params[:search].blank?
if params[:salary].to_i.zero?
@name.to_s
else
"Totals #{@jobs_count} jobs"
end
else
"Totals #{@jobs_count} result for #{params[:search]} in #{@name}"
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
class Solr
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
end
......@@ -14,14 +14,15 @@ class Solr
job_level: job.position,
min_salary: job.min_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,
industries_name: job.industries.map { |i| i.name.gsub(' / ', ', ') },
industries_name: job.industries.map(&:name),
industry_id: job.industries&.ids
}
end
jobs_index.each do |add_jobs|
# byebug
@solr.add(add_jobs)
rescue Exception
next
......@@ -38,8 +39,11 @@ class Solr
def query_all
q = "search:*#{@params[:search]}*"
fq = ''
fq = if @params[:salary]
"min_salary: [#{@params[:salary]} TO *]"
else
''
end
send_request(q, fq)
end
......@@ -50,7 +54,11 @@ class Solr
city_name = city.name
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)
end
......@@ -62,21 +70,49 @@ class Solr
industry_name = industry.name
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)
end
def send_request(q_param, fq_param)
response = @solr.get 'select', params: {
q: q_param,
fq: fq_param,
rows: Job.count
def facet_query(facet_param)
q = '*:*'
fq = '*:*'
facet = facet_param
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
def escape_str(str)
RSolr.solr_escape(str)
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
......@@ -18,9 +18,9 @@
= region.upcase
hr.my-4
.row
- city_job_count.each do |city, count|
- city_job_count.each do |city|
.col-lg-4.col-md-6.text-center
.mt-5
.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'
p.text-muted.mb-0= pluralize(count, 'job')
\ No newline at end of file
p.text-muted.mb-0= pluralize(city[2], 'job')
\ No newline at end of file
......@@ -3,10 +3,10 @@
h2.mt-0 INDUSTRIES
hr.my-4
#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
.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'
p.text-muted.mb-0= pluralize(job_count, 'job')
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(industry[2], 'job')
hr.divider.my-4
......@@ -3,22 +3,38 @@
-if params[:city_slug]
= form_tag(city_jobs_path(city_slug: params[:city_slug]), method: :get, class: "form-inline") do
.row
.col-md-10.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'
.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'
.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"
-elsif params[:industry_slug]
= form_tag(industry_jobs_path(industry_slug: params[:industry_slug]), method: :get, class: "form-inline") do
.row
.col-md-10.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'
.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'
.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"
- else
= form_tag(jobs_path, method: :get, class: "form-inline") do
.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'
.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"
\ No newline at end of file
......@@ -64,7 +64,7 @@ namespace :crawler do
end
# salary
if salary.include?('USD')
parsed = parse_salary(salary.remove('USD'), 23_000)
parsed = parse_salary(salary.remove('USD', ','), 23_000)
if parsed.length == 1
min_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