search-function

parent 01b04e4a
Pipeline #1483 failed with stages
in 0 seconds
...@@ -14,7 +14,7 @@ gem 'babosa' ...@@ -14,7 +14,7 @@ gem 'babosa'
gem 'active_storage_validations' gem 'active_storage_validations'
gem 'mini_magick', '>= 4.9.5' gem 'mini_magick', '>= 4.9.5'
gem 'devise' gem 'devise'
gem 'rsolr'
# Use sqlite3 as the database for Active Record # Use sqlite3 as the database for Active Record
gem 'mysql2', '~> 0.5.3' gem 'mysql2', '~> 0.5.3'
# Use Puma as the app server # Use Puma as the app server
......
...@@ -100,6 +100,25 @@ GEM ...@@ -100,6 +100,25 @@ GEM
warden (~> 1.2.3) warden (~> 1.2.3)
erubi (1.10.0) erubi (1.10.0)
execjs (2.8.1) 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) ffi (1.15.3)
friendly_id (5.4.2) friendly_id (5.4.2)
activerecord (>= 4.0.0) activerecord (>= 4.0.0)
...@@ -135,6 +154,7 @@ GEM ...@@ -135,6 +154,7 @@ GEM
mini_mime (1.1.0) mini_mime (1.1.0)
minitest (5.14.4) minitest (5.14.4)
msgpack (1.4.2) msgpack (1.4.2)
multipart-post (2.1.1)
mysql2 (0.5.3) mysql2 (0.5.3)
nio4r (2.5.7) nio4r (2.5.7)
nokogiri (1.11.7-x86_64-linux) nokogiri (1.11.7-x86_64-linux)
...@@ -186,6 +206,10 @@ GEM ...@@ -186,6 +206,10 @@ GEM
responders (3.0.1) responders (3.0.1)
actionpack (>= 5.0) actionpack (>= 5.0)
railties (>= 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) rubyzip (2.3.1)
sass-rails (6.0.0) sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1) sassc-rails (~> 2.1, >= 2.1.1)
...@@ -272,6 +296,7 @@ DEPENDENCIES ...@@ -272,6 +296,7 @@ DEPENDENCIES
puma (~> 5.0) puma (~> 5.0)
rack-mini-profiler (~> 2.0) rack-mini-profiler (~> 2.0)
rails (~> 6.1.3, >= 6.1.3.2) rails (~> 6.1.3, >= 6.1.3.2)
rsolr
sass-rails (>= 6) sass-rails (>= 6)
selenium-webdriver selenium-webdriver
slim-rails slim-rails
......
...@@ -21,6 +21,19 @@ class JobsController < ApplicationController ...@@ -21,6 +21,19 @@ class JobsController < ApplicationController
@job = Job.find_by(slug: params[:job_slug]) or not_found @job = Job.find_by(slug: params[:job_slug]) or not_found
end end
def search
@keyword = job_params[:search].gsub!(/[^[:alnum:]]/, ' ')
solr = RSolr.connect url: 'http://localhost:8983/solr/VeNJOB'
response = solr.get 'select', params: {
q: "city: #{@keyword}* or title: #{@keyword}* or industry: #{@keyword}* or company: #{@keyword}*",
start: 0,
rows: 2_147_483_647
}
result = response['response']['docs']
@result_search = Kaminari.paginate_array(result).page(params[:page])
@total = result.count
end
private private
def history_action def history_action
...@@ -34,7 +47,7 @@ class JobsController < ApplicationController ...@@ -34,7 +47,7 @@ class JobsController < ApplicationController
end end
def job_params def job_params
params.permit(:job_slug) params.permit(:job_slug, :search)
end end
def history_query def history_query
......
...@@ -28,4 +28,8 @@ module ApplicationHelper ...@@ -28,4 +28,8 @@ module ApplicationHelper
def favorite_text(job) def favorite_text(job)
FavoriteJob.find_by(job: job, user: current_user).present? ? 'Unfavorite' : 'Favorite' FavoriteJob.find_by(job: job, user: current_user).present? ? 'Unfavorite' : 'Favorite'
end end
def search(input)
Job.find_by(id: input['id'])
end
end end
...@@ -3,9 +3,9 @@ nav.breadcrumb[style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb"] ...@@ -3,9 +3,9 @@ nav.breadcrumb[style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumb"]
li.breadcrumb-item li.breadcrumb-item
= link_to "Top", root_path = link_to "Top", root_path
li.breadcrumb-item li.breadcrumb-item
- @job.cities.each.uniq do |city| - @job.cities.uniq.each do |city|
= link_to city.name + ' ', city_slug_path(city.slug) = link_to city.name + ' ', city_slug_path(city.slug)
li.breadcrumb-item li.breadcrumb-item
- @job.industries.each do |industry| - @job.industries.uniq.each do |industry|
= link_to industry.name + ' ', industry_slug_path(industry.slug) = link_to industry.name + ' ', industry_slug_path(industry.slug)
li.breadcrumb-item.active = @job.title li.breadcrumb-item.active = @job.title
\ No newline at end of file
.search.p-3.offset-md-2 .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" = text_field_tag :search, params[:search], placeholder: "Search", class: "form"
= submit_tag "Search", name: nil, class: 'btn-primary' = 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 @result_search, window: 1
.job-list
- @result_search.each do |job|
.row.bg-white
.col-10.p-3.card-body.text-dark
h5.mb-1
= link_to search(job).title, detail_path(job['slug'])
p.mb-1
= search(job).company.name
p.mb-1
i.fas.fa-dollar-sign.m-1
| Lương:
= search(job).salary
p.mb-1
i.fas.fa-map-marker-alt.m-1
= search(job).cities.map(&:name).uniq.join(' | ')
p.mb-1
i.fas.fa-map-marker-alt.m-1
= search(job).industries.map(&:name).uniq.join(' | ')
p.mb-1
= truncate(search(job).overview, length: 250)
.col-sm-2.p-3.favourite
= render partial: "favorite_jobs/favorite", locals: { job: search(job) }
-if @result_search.any?
.d-flex.justify-content-center.p-2
= page_entries_info @result_search
.d-flex.justify-content-center.p-2
= paginate @result_search, window: 1
-else
h4.text-center
| Not have any jobs you need
\ No newline at end of file
...@@ -13,6 +13,7 @@ Rails.application.routes.draw do ...@@ -13,6 +13,7 @@ Rails.application.routes.draw do
delete 'unfavorite', to: 'favorite_jobs#destroy' delete 'unfavorite', to: 'favorite_jobs#destroy'
get 'history', to: 'history_jobs#index', as: 'history' get 'history', to: 'history_jobs#index', as: 'history'
get '/my/jobs', to: 'apply_jobs#index', as: 'applied_job' 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' } devise_for :users, skip: %i[sessions registrations passwords], controllers: { confirmations: 'users/confirmations' }
get '/my', to: 'users#show' get '/my', to: 'users#show'
devise_scope :user do devise_scope :user do
......
namespace :solr do
desc "Add data into apache solr"
task setup: :environment do
data = Job.all.includes(:cities, :industries, :company)
solr = RSolr.connect url: 'http://localhost:8983/solr/VeNJOB'
data.each do |record|
id = record.id
title = record.title
salary = record.salary
overview = record.overview
company = record.company.name
experience = record.experience
job_type = record.job_type
level = record.level
slug = record.slug
job_cities = []
cities = record.cities.uniq
cities.each do |city|
city_name = city.name
job_cities << city_name
end
job_industries = []
industries = record.industries.uniq
industries.each do |industry|
industry_name = industry.name
job_industries << industry_name
end
solr.add(id: id, title: title, overview: overview, salary: salary, company: company, experience: experience,
job_type: job_type, level: level, city: job_cities, industry: job_industries, slug: slug)
solr.commit
end
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