Changed Search to Elastic Search

This commit is contained in:
saurabhbhatia 2013-12-20 18:41:12 +08:00
parent fd24fbe082
commit 84edbdb6db
9 changed files with 83 additions and 72 deletions

12
Gemfile
View File

@ -26,10 +26,13 @@ gem "geocoder"
gem 'mini_magick' gem 'mini_magick'
gem 'mongoid', '> 2.1', '< 3.0.0' gem 'mongoid', '> 2.1', '< 3.0.0'
gem 'mongoid_search', '~> 0.2.8' # gem 'mongoid_search', :github => 'mauriciozaffari/mongoid_search', :branch => 'mongoid_2.x.x'
gem 'mongoid-tree', :require => 'mongoid/tree' gem 'mongoid-tree', :require => 'mongoid/tree'
gem "mongo_session_store-rails3", '3.0.6' gem "mongo_session_store-rails3", '3.0.6'
gem 'nokogiri' gem 'nokogiri'
# gem 'riddle', '1.3.3'
# gem 'mongoid-sphinx', :github => 'Rulingcom/mongoid-sphinx', :require => 'mongoid_sphinx'
gem 'tire'
gem 'fb_graph' gem 'fb_graph'
gem 'rack-gridfs' gem 'rack-gridfs'
@ -43,11 +46,6 @@ gem 'resque-restriction'
# gem 'ruby-debug19' # gem 'ruby-debug19'
gem 'rubyzip', '< 1.0.0' gem 'rubyzip', '< 1.0.0'
gem 'sunspot_mongoid2'
# gem 'sunspot_mongo'
gem 'sunspot_solr', github: 'sunspot/sunspot', branch: 'master'
gem 'sunspot_rails', github: 'sunspot/sunspot', branch: 'master'
gem 'progress_bar' gem 'progress_bar'
gem 'sinatra' gem 'sinatra'
@ -95,7 +93,7 @@ group :test, :development do
gem 'pry-debugger' gem 'pry-debugger'
gem 'debugger' gem 'debugger'
gem 'faker' gem 'faker'
gem "sunspot-rails-tester" # gem "sunspot-rails-tester"
gem 'database_cleaner' #Strategies for cleaning databases. Can be used to ensure a clean state for testing. gem 'database_cleaner' #Strategies for cleaning databases. Can be used to ensure a clean state for testing.
gem "rspec", "~> 2.0" gem "rspec", "~> 2.0"
gem "rspec-rails", "~> 2.0" gem "rspec-rails", "~> 2.0"

View File

@ -1,2 +0,0 @@
Sunspot.session = Sunspot::Rails.build_session
ActionController::Base.module_eval { include(Sunspot::Rails::RequestLifecycle) }

View File

@ -10,16 +10,16 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
def search_result def search_result
if params[:search_query] == "" if params[:search_query] == ""
@bulletins = get_bulletins_for_index @bulletins = get_bulletins_for_index
else else
@search = Bulletin.solr_search do # @search = Bulletin.solr_search do
fulltext params[:search_query] # fulltext params[:search_query]
with(:frontend_search,true) # with(:frontend_search,true)
with(:available_lang).any_of([I18n.locale.to_s]) # with(:available_lang).any_of([I18n.locale.to_s])
end # end
# @bulletins = Bulletin.where(:category_id.in => params[:category_id]).and(:is_rejected=>false).and(:is_pending=>false) # @bulletins = Bulletin.where(:category_id.in => params[:category_id]).and(:is_rejected=>false).and(:is_pending=>false)
search_result = @search.results.collect{|result| result.id} @search = Bulletin.tire.search "#{params[:search_query]}"
search_result = @search.collect{|result| result.id}
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(@page_num) @bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(@page_num)
end end

View File

@ -47,6 +47,18 @@ class Panel::Announcement::Widget::BulletinsController < OrbitWidgetController
# @categories = @module_app.categories.enabled # @categories = @module_app.categories.enabled
# end # end
def search_result
if params[:search_query] == ""
redirect_to panel_announcement_front_end_search_result_path
else
@search = Bulletin.tire.search "#{params[:search_query]}"
search_result = @search.collect{|result| result.id}
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_in(_id:search_result).page( params[:page_main]).per(@page_num)
redirect_to panel_announcement_front_end_search_result_path(params[:search_result])
end
end
def bulletins_list_and_pic def bulletins_list_and_pic

View File

@ -3,9 +3,6 @@ class Bulletin
include Mongoid::Document include Mongoid::Document
include Mongoid::Timestamps include Mongoid::Timestamps
include Mongoid::MultiParameterAttributes include Mongoid::MultiParameterAttributes
# include Mongoid::FullTextSearch
include Mongoid::Search
include Sunspot::Mongoid2
include Impressionist::Impressionable include Impressionist::Impressionable
include OrbitCategory::Categorizable include OrbitCategory::Categorizable
@ -16,6 +13,9 @@ class Bulletin
include OrbitModel::TimeFrame include OrbitModel::TimeFrame
include OrbitTag::Taggable include OrbitTag::Taggable
include Tire::Model::Search
include Tire::Model::Callbacks
is_impressionable :counter_cache => { :column_name => :view_count } is_impressionable :counter_cache => { :column_name => :view_count }
field :title, localize: true field :title, localize: true
@ -39,33 +39,24 @@ class Bulletin
validates :title, :at_least_one => true validates :title, :at_least_one => true
search_in :title, :subtitle, :text def to_indexed_json
self.to_json
end
# search_in :title, :subtitle, :text
#before_save :clean_values, :save_bulletin_links, :save_bulletin_files #before_save :clean_values, :save_bulletin_links, :save_bulletin_files
searchable do # def self.search(str, options={})
text :titles do # options[:limit] = options[:limit] || 50
title_translations.to_a.collect{|t| t[1]} # # default limit: 50 (mongoDB default: 100)
end
text :texts do # res = self.mongo_session.command({ text: self.collection.name,
text_translations.to_a.collect{|t| Nokogiri::HTML(t[1]).text} # search: str}.merge(options))
end
# # We shall now return a criteria of resulting objects!!
string :available_lang , :multiple => true do # self.where(:id.in => res['results'].collect {|o| o['obj']['_id']})
VALID_LOCALES.collect{|t| enabled_for_lang(t.to_sym) ? t : nil}.delete_if{|t| t.nil?} # end
end
# text :text do
# a = (title_translations["zh_tw"] + title_translations["en"])
# a
# end
boolean :frontend_search do
# ( !is_hidden && !is_pending && is_checked && !is_rejected )
(!is_hidden)
end
integer :view_count
string :category_id
end
def bulletin_category_with_title def bulletin_category_with_title
self.category.title self.category.title
@ -87,19 +78,19 @@ class Bulletin
published_at.strftime("%B %Y") published_at.strftime("%B %Y")
end end
def self.search( search = nil, category_id = nil ) # def self.search( search = nil, category_id = nil )
if category_id.to_s.size > 0 and search.to_s.size > 0 # if category_id.to_s.size > 0 and search.to_s.size > 0
key = /#{search}/ # key = /#{search}/
find(:all, :conditions => {title: key, category_id: category_id}).desc( :is_top, :postdate ) # find(:all, :conditions => {title: key, category_id: category_id}).desc( :is_top, :postdate )
elsif category_id.to_s.size > 0 and search.to_s.size < 1 # elsif category_id.to_s.size > 0 and search.to_s.size < 1
find(:all, :conditions => {category_id: category_id}).desc( :is_top, :postdate ) # find(:all, :conditions => {category_id: category_id}).desc( :is_top, :postdate )
elsif search.to_s.size > 0 and category_id.to_s.size < 1 # elsif search.to_s.size > 0 and category_id.to_s.size < 1
key = /#{search}/ # key = /#{search}/
find(:all, :conditions => {title: key}).desc( :is_top, :postdate ) # find(:all, :conditions => {title: key}).desc( :is_top, :postdate )
else # else
find(:all).desc( :is_top, :postdate) # find(:all).desc( :is_top, :postdate)
end # end
end # end
def self.widget_datas( category_id = nil ) def self.widget_datas( category_id = nil )

View File

@ -1,4 +1,5 @@
<%= form_tag panel_announcement_front_end_announcement_search_path, method: :get do %> <p>Search</p>
<%= form_tag panel_announcement_widget_search_result_path, method: :get do %>
<%= hidden_field_tag :category_id, params[:category_id] %> <%= hidden_field_tag :category_id, params[:category_id] %>
<%= hidden_field_tag :tag_id, params[:tag_id] %> <%= hidden_field_tag :tag_id, params[:tag_id] %>
<p> <p>

View File

@ -27,7 +27,7 @@ Rails.application.routes.draw do
end end
namespace :front_end do namespace :front_end do
match "index_by_unit" => "bulletins#index_bulletins_by_unit",:as => :index_bulletins_by_unit match "index_by_unit" => "bulletins#index_bulletins_by_unit",:as => :index_bulletins_by_unit
match "search_result" => "bulletins#search_result",:as=>:announcement_search match "search_result" => "bulletins#search_result"
resources :bulletins # do resources :bulletins # do
# match "preview" => "bulletins#preview_content",:as => :get_preview_content # match "preview" => "bulletins#preview_content",:as => :get_preview_content
# end # end
@ -39,6 +39,7 @@ Rails.application.routes.draw do
match "reload_web_links" => "bulletins#reload_web_links" match "reload_web_links" => "bulletins#reload_web_links"
match "bulletins_side_bar" => "bulletins#bulletins_side_bar" match "bulletins_side_bar" => "bulletins#bulletins_side_bar"
match "bulletins_search_block" => "bulletins#bulletins_search_block" match "bulletins_search_block" => "bulletins#bulletins_search_block"
match "search_result" => "bulletins#search_result"
end end
end end
end end

View File

@ -7,10 +7,12 @@ class Panel::Archive::FrontEnd::ArchiveFilesController < OrbitWidgetController
end end
def get_search_result def get_search_result
@search = ArchiveFileCategory.solr_search do # @search = ArchiveFileCategory.solr_search do
fulltext params[:search_query] # fulltext params[:search_query]
with(:frontend_search,true) # with(:frontend_search,true)
end # end
@search = ArchiveFile.search(params[:search_query])
search_result = @search.results.collect{|result| result.id} search_result = @search.results.collect{|result| result.id}
params[:category_id] = @search.results.collect{|result| result.id} params[:category_id] = @search.results.collect{|result| result.id}

View File

@ -4,7 +4,6 @@ class ArchiveFile
include Mongoid::Timestamps include Mongoid::Timestamps
include Mongoid::MultiParameterAttributes include Mongoid::MultiParameterAttributes
include Mongoid::Sortable include Mongoid::Sortable
include Sunspot::Mongoid2
include OrbitCategory::Categorizable include OrbitCategory::Categorizable
include OrbitModel::LanguageRestrict include OrbitModel::LanguageRestrict
@ -12,6 +11,9 @@ class ArchiveFile
include OrbitModel::TimeFrame include OrbitModel::TimeFrame
include OrbitTag::Taggable include OrbitTag::Taggable
include Tire::Model::Search
include Tire::Model::Callbacks
# BelongsToCategory = :archive_file_category # BelongsToCategory = :archive_file_category
# PAYMENT_TYPES = @site_valid_locales # PAYMENT_TYPES = @site_valid_locales
@ -33,6 +35,12 @@ class ArchiveFile
after_save :save_archive_file_multiples after_save :save_archive_file_multiples
def to_indexed_json
self.to_json
end
# search_in :title
# searchable do # searchable do
# text :titles do # text :titles do
# title_translations.to_a.collect{|t| t[1]} # title_translations.to_a.collect{|t| t[1]}
@ -44,19 +52,19 @@ class ArchiveFile
# end # end
def self.search( category_id = nil ) # def self.search( category_id = nil )
if category_id.to_s.size > 0 # if category_id.to_s.size > 0
find(:all, :conditions => {archive_file_category_id: category_id}).desc( :is_top, :title ) # find(:all, :conditions => {archive_file_category_id: category_id}).desc( :is_top, :title )
else # else
find(:all).desc( :is_top, :title) # find(:all).desc( :is_top, :title)
end # end
end # end
def self.widget_datas def self.widget_datas