Commit 76e39781 by Thanh Hung Pham

Merge branch 'search-funtion' into 'master'

search-function

See merge request !12
parents 01b04e4a 42fd7020
Pipeline #1494 failed with stages
in 0 seconds
......@@ -14,7 +14,7 @@ gem 'babosa'
gem 'active_storage_validations'
gem 'mini_magick', '>= 4.9.5'
gem 'devise'
gem 'rsolr'
# Use sqlite3 as the database for Active Record
gem 'mysql2', '~> 0.5.3'
# Use Puma as the app server
......
......@@ -100,6 +100,25 @@ GEM
warden (~> 1.2.3)
erubi (1.10.0)
execjs (2.8.1)
faraday (1.8.0)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0.1)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.1)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
multipart-post (>= 1.2, < 3)
ruby2_keywords (>= 0.0.4)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
ffi (1.15.3)
friendly_id (5.4.2)
activerecord (>= 4.0.0)
......@@ -135,6 +154,7 @@ GEM
mini_mime (1.1.0)
minitest (5.14.4)
msgpack (1.4.2)
multipart-post (2.1.1)
mysql2 (0.5.3)
nio4r (2.5.7)
nokogiri (1.11.7-x86_64-linux)
......@@ -186,6 +206,10 @@ GEM
responders (3.0.1)
actionpack (>= 5.0)
railties (>= 5.0)
rsolr (2.3.0)
builder (>= 2.1.2)
faraday (>= 0.9.0)
ruby2_keywords (0.0.5)
rubyzip (2.3.1)
sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1)
......@@ -272,6 +296,7 @@ DEPENDENCIES
puma (~> 5.0)
rack-mini-profiler (~> 2.0)
rails (~> 6.1.3, >= 6.1.3.2)
rsolr
sass-rails (>= 6)
selenium-webdriver
slim-rails
......
......@@ -21,6 +21,15 @@ class JobsController < ApplicationController
@job = Job.find_by(slug: params[:job_slug]) or not_found
end
def search
@keyword = job_params[:search].gsub!(/[^[:alnum:]]/, ' ')
response = SolrSearch.new.search(@keyword, params[:page])
job_ids = response['response']['docs'].map { |job| job['job_id'] }
jobs = Job.latest_jobs.find(job_ids)
@total = response['response']['numFound']
@jobs = Kaminari.paginate_array(jobs, total_count: @total).page(params[:page])
end
private
def history_action
......@@ -34,7 +43,7 @@ class JobsController < ApplicationController
end
def job_params
params.permit(:job_slug)
params.permit(:job_slug, :search)
end
def history_query
......
......@@ -8,7 +8,7 @@ class Job < ApplicationRecord
has_and_belongs_to_many :industries
has_and_belongs_to_many :cities
LATEST_JOB_NUMBER = 5
scope :latest_jobs, -> { includes(:cities, :company).order('created_at DESC') }
scope :latest_jobs, -> { includes(:cities, :company, :industries).order('created_at DESC') }
def normalize_friendly_id(string)
string.to_s.to_slug.normalize(transliterations: :vietnamese).to_s
......
......@@ -3,9 +3,9 @@ nav.breadcrumb[style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb"]
li.breadcrumb-item
= link_to "Top", root_path
li.breadcrumb-item
- @job.cities.each.uniq do |city|
- @job.cities.uniq.each do |city|
= link_to city.name + ' ', city_slug_path(city.slug)
li.breadcrumb-item
- @job.industries.each do |industry|
- @job.industries.uniq.each do |industry|
= link_to industry.name + ' ', industry_slug_path(industry.slug)
li.breadcrumb-item.active = @job.title
\ No newline at end of file
.search.p-3.offset-md-2
= form_with(url: '/jobs', local: true) do
= form_with(url: '/jobs', method: 'get', local: true) do
= text_field_tag :search, params[:search], placeholder: "Search", class: "form"
= submit_tag "Search", name: nil, class: 'btn-primary'
.container.p-3
h5.fw-normal
| Total:
= pluralize(@total, 'job')
h5.fw-normal
| Result for:
= @keyword
.d-flex.justify-content-center.p-2
= paginate @jobs, window: 1
.job-list
- @jobs.each do |job|
.row.bg-white
.col-10.p-3.card-body.text-dark
h5.mb-1
= link_to job.title, detail_path(job.slug)
p.mb-1
= job.company.name
p.mb-1
i.fas.fa-dollar-sign.m-1
| Lương:
= job.salary
p.mb-1
i.fas.fa-map-marker-alt.m-1
= job.cities.map(&:name).uniq.join(' | ')
p.mb-1
i.fas.fa-map-marker-alt.m-1
= job.industries.map(&:name).uniq.join(' | ')
p.mb-1
= truncate(job.overview, length: 250)
.col-sm-2.p-3.favourite
= render partial: "favorite_jobs/favorite", locals: { job: job }
-if @jobs.any?
.d-flex.justify-content-center.p-2
= page_entries_info @jobs
.d-flex.justify-content-center.p-2
= paginate @jobs, window: 1
-else
h4.text-center
| Not have any jobs you need
\ No newline at end of file
......@@ -17,6 +17,7 @@ module VeNJOB
# in config/environments, which are processed later.
#
config.time_zone = 'Hanoi'
config.eager_load_paths << "#{Rails.root}/lib/solr"
# config.eager_load_paths << Rails.root.join("extras")
end
end
......@@ -13,6 +13,7 @@ Rails.application.routes.draw do
delete 'unfavorite', to: 'favorite_jobs#destroy'
get 'history', to: 'history_jobs#index', as: 'history'
get '/my/jobs', to: 'apply_jobs#index', as: 'applied_job'
get 'jobs', to: 'jobs#search', as: 'search'
devise_for :users, skip: %i[sessions registrations passwords], controllers: { confirmations: 'users/confirmations' }
get '/my', to: 'users#show'
devise_scope :user do
......
class SolrSearch
def initialize
@solr = RSolr.connect url: 'http://localhost:8983/solr/VeNJOB'
end
def search(keyword, current_page)
@solr.paginate current_page, 20, 'select', params: {
q: "cities_name: #{keyword} or title: #{keyword} or industries_name: #{keyword} or company_name: #{keyword}",
fl: 'job_id'
}
end
def add_data
logger = Logger.new("#{Rails.root}/log/add_data_solr.log")
logger.info "Start add data at: #{Time.current}"
data = Job.all.includes(:cities, :industries, :company)
data.each do |record|
job_id = record.id
title = record.title
company_name = record.company.name
cities = record.cities.uniq.map(&:name)
industries = record.industries.uniq.map(&:name)
slug = record.slug
@solr.add(job_id: job_id, title: title, company_name: company_name, cities_name: cities,
industries_name: industries, slug: slug)
@solr.commit
rescue StandardError => error
logger.error("The job has error: #{job_id}")
logger.error(error)
next
end
logger.info "End add data at: #{Time.current}"
end
def delete_data
@solr.delete_by_query '*:*'
@solr.commit
end
end
namespace :solr do
desc 'Add data into apache solr'
task setup: :environment do
connect_solr.add_data
end
desc 'Delete data in apache solr'
task delete_data: :environment do
connect_solr.delete_data
end
def connect_solr
SolrSearch.new
end
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