Search feature repaired
This commit is contained in:
parent
f940e96014
commit
f3a8b7c3a5
8 changed files with 60 additions and 29 deletions
2
Gemfile
2
Gemfile
|
|
@ -75,7 +75,7 @@ gem 'fancybox2-rails', '~> 0.2.4'
|
||||||
#gem 'textacular', require: 'textacular/rails'
|
#gem 'textacular', require: 'textacular/rails'
|
||||||
|
|
||||||
# Trying pg_search for full-text search… too slow with ranking… screw PostgreSQL
|
# Trying pg_search for full-text search… too slow with ranking… screw PostgreSQL
|
||||||
#gem 'pg_search'
|
gem 'pg_search'
|
||||||
|
|
||||||
# Let's use Elasticsearch. "tire" has been retired but there is not yet a worthy alternative.
|
# Let's use Elasticsearch. "tire" has been retired but there is not yet a worthy alternative.
|
||||||
#gem 'tire'
|
#gem 'tire'
|
||||||
|
|
|
||||||
24
Gemfile.lock
24
Gemfile.lock
|
|
@ -25,7 +25,6 @@ GEM
|
||||||
multi_json (~> 1.3)
|
multi_json (~> 1.3)
|
||||||
thread_safe (~> 0.1)
|
thread_safe (~> 0.1)
|
||||||
tzinfo (~> 0.3.37)
|
tzinfo (~> 0.3.37)
|
||||||
ansi (1.4.3)
|
|
||||||
arel (4.0.1)
|
arel (4.0.1)
|
||||||
atomic (1.1.14)
|
atomic (1.1.14)
|
||||||
better_errors (1.0.1)
|
better_errors (1.0.1)
|
||||||
|
|
@ -51,7 +50,6 @@ GEM
|
||||||
foundation-rails (5.4.5.0)
|
foundation-rails (5.4.5.0)
|
||||||
railties (>= 3.1.0)
|
railties (>= 3.1.0)
|
||||||
sass (>= 3.2.0)
|
sass (>= 3.2.0)
|
||||||
hashr (0.0.22)
|
|
||||||
hike (1.2.3)
|
hike (1.2.3)
|
||||||
i18n (0.6.5)
|
i18n (0.6.5)
|
||||||
jbuilder (1.5.2)
|
jbuilder (1.5.2)
|
||||||
|
|
@ -61,9 +59,6 @@ GEM
|
||||||
railties (>= 3.0, < 5.0)
|
railties (>= 3.0, < 5.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
json (1.8.1)
|
json (1.8.1)
|
||||||
kaminari (0.14.1)
|
|
||||||
actionpack (>= 3.0.0)
|
|
||||||
activesupport (>= 3.0.0)
|
|
||||||
mail (2.5.4)
|
mail (2.5.4)
|
||||||
mime-types (~> 1.16)
|
mime-types (~> 1.16)
|
||||||
treetop (~> 1.4.8)
|
treetop (~> 1.4.8)
|
||||||
|
|
@ -75,6 +70,10 @@ GEM
|
||||||
minitest (4.7.5)
|
minitest (4.7.5)
|
||||||
multi_json (1.8.2)
|
multi_json (1.8.2)
|
||||||
pg (0.17.0)
|
pg (0.17.0)
|
||||||
|
pg_search (0.7.8)
|
||||||
|
activerecord (>= 3.1)
|
||||||
|
activesupport (>= 3.1)
|
||||||
|
arel
|
||||||
polyglot (0.3.3)
|
polyglot (0.3.3)
|
||||||
rack (1.5.2)
|
rack (1.5.2)
|
||||||
rack-contrib (1.1.0)
|
rack-contrib (1.1.0)
|
||||||
|
|
@ -97,8 +96,6 @@ GEM
|
||||||
rake (10.1.0)
|
rake (10.1.0)
|
||||||
rdoc (3.12.2)
|
rdoc (3.12.2)
|
||||||
json (~> 1.4)
|
json (~> 1.4)
|
||||||
rest-client (1.6.7)
|
|
||||||
mime-types (>= 1.16)
|
|
||||||
sass (3.2.12)
|
sass (3.2.12)
|
||||||
sass-rails (4.0.1)
|
sass-rails (4.0.1)
|
||||||
railties (>= 4.0.0, < 5.0)
|
railties (>= 4.0.0, < 5.0)
|
||||||
|
|
@ -129,14 +126,6 @@ GEM
|
||||||
thread_safe (0.1.3)
|
thread_safe (0.1.3)
|
||||||
atomic
|
atomic
|
||||||
tilt (1.4.1)
|
tilt (1.4.1)
|
||||||
tire (0.6.1)
|
|
||||||
activemodel (>= 3.0)
|
|
||||||
activesupport
|
|
||||||
ansi
|
|
||||||
hashr (~> 0.0.19)
|
|
||||||
multi_json (~> 1.3)
|
|
||||||
rake
|
|
||||||
rest-client (~> 1.6)
|
|
||||||
treetop (1.4.15)
|
treetop (1.4.15)
|
||||||
polyglot
|
polyglot
|
||||||
polyglot (>= 0.3.1)
|
polyglot (>= 0.3.1)
|
||||||
|
|
@ -144,6 +133,7 @@ GEM
|
||||||
uglifier (2.3.1)
|
uglifier (2.3.1)
|
||||||
execjs (>= 0.3.0)
|
execjs (>= 0.3.0)
|
||||||
json (>= 1.8.0)
|
json (>= 1.8.0)
|
||||||
|
will_paginate (3.0.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
@ -156,12 +146,12 @@ DEPENDENCIES
|
||||||
foundation-rails
|
foundation-rails
|
||||||
jbuilder (~> 1.2)
|
jbuilder (~> 1.2)
|
||||||
jquery-rails
|
jquery-rails
|
||||||
kaminari
|
|
||||||
meta_request
|
meta_request
|
||||||
pg
|
pg
|
||||||
|
pg_search
|
||||||
rails (= 4.0.0)
|
rails (= 4.0.0)
|
||||||
sass-rails (~> 4.0.0)
|
sass-rails (~> 4.0.0)
|
||||||
sdoc
|
sdoc
|
||||||
slim-rails
|
slim-rails
|
||||||
tire
|
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
|
will_paginate
|
||||||
|
|
|
||||||
29
README.Developer
Normal file
29
README.Developer
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Full text search
|
||||||
|
|
||||||
|
The pg_search Ruby gem is used for full-text searched in Rails.
|
||||||
|
See: https://github.com/Casecommons/pg_search
|
||||||
|
|
||||||
|
Reformatted SQL query for fulltext search:
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM "packages" WHERE (
|
||||||
|
(
|
||||||
|
(
|
||||||
|
to_tsvector('simple', coalesce("packages"."name"::text, ''))
|
||||||
|
||
|
||||||
|
to_tsvector('simple', coalesce("packages"."description"::text, ''))
|
||||||
|
||
|
||||||
|
to_tsvector('simple', coalesce("packages"."long_description"::text, ''))
|
||||||
|
)
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
to_tsquery('simple', '''' || 'browser' || ' ''')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Index:
|
||||||
|
|
||||||
|
CREATE INDEX packages_gin ON packages USING GIN( (to_tsvector('simple',
|
||||||
|
coalesce("packages"."name"::text, '')) || to_tsvector('simple',
|
||||||
|
coalesce("packages"."description"::text, '')) || to_tsvector('simple',
|
||||||
|
coalesce("packages"."long_description"::text, ''))) );
|
||||||
|
|
@ -6,6 +6,13 @@ class PackagesController < ApplicationController
|
||||||
@packages = @packages.text_search(params[:query])
|
@packages = @packages.text_search(params[:query])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if params[:search]
|
||||||
|
logger.debug "Searching for #{params[:search]}"
|
||||||
|
#search_phrase = params[:search].split.join('&')
|
||||||
|
#@packages = @packages.general_search([:name,:description], search_phrase, :language=>'english', :rank=>true)
|
||||||
|
@packages = @packages.general_search(params[:search])
|
||||||
|
end
|
||||||
|
|
||||||
# Limit the packages to those that have approved screenshots.
|
# Limit the packages to those that have approved screenshots.
|
||||||
# Also eager-load the screenshots.
|
# Also eager-load the screenshots.
|
||||||
if params[:show]=='onlywith'
|
if params[:show]=='onlywith'
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,16 @@
|
||||||
class Package < ActiveRecord::Base
|
class Package < ActiveRecord::Base
|
||||||
|
# PostgreSQL-based full-text search:
|
||||||
|
# https://github.com/Casecommons/pg_search
|
||||||
|
include PgSearch
|
||||||
|
# TODO: Make search weighted on users' rating
|
||||||
|
pg_search_scope :general_search, :against => [:name, :description, :long_description]
|
||||||
|
|
||||||
has_many :screenshots, :inverse_of=>:package
|
has_many :screenshots, :inverse_of=>:package
|
||||||
|
|
||||||
default_scope {
|
default_scope {
|
||||||
order('name ASC')
|
order('name ASC')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Return a query of all packages that have screenshots
|
# Return a query of all packages that have screenshots
|
||||||
def self.with_screenshots
|
def self.with_screenshots
|
||||||
# Query for all packages who's ID appears in a screenshot's "package_id" field
|
# Query for all packages who's ID appears in a screenshot's "package_id" field
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
.item
|
.item
|
||||||
// Switch to grid view
|
// Switch to grid view
|
||||||
//a href=url(:package, :index)
|
//a href=url(:package, :index)
|
||||||
= link_to packages_grid_path
|
= link_to packages_grid_path, search: params[:search]
|
||||||
img src="/images/sidebar/grid0.svg" width=40 height=40
|
img src="/images/sidebar/grid0.svg" width=40 height=40
|
||||||
.item.space
|
.item.space
|
||||||
img src="/images/sidebar/list1.svg" width=40 height=40
|
img src="/images/sidebar/list1.svg" width=40 height=40
|
||||||
|
|
@ -15,35 +15,35 @@
|
||||||
.item.space
|
.item.space
|
||||||
// Switch to list view
|
// Switch to list view
|
||||||
//a href=url(:package, :index, view: 'list')
|
//a href=url(:package, :index, view: 'list')
|
||||||
= link_to packages_list_path
|
= link_to packages_list_path, search: params[:search]
|
||||||
img src="/images/sidebar/list0.svg" width=40 height=40
|
img src="/images/sidebar/list0.svg" width=40 height=40
|
||||||
|
|
||||||
// Cycling between with/without/any packages filter
|
// Cycling between with/without/any packages filter
|
||||||
.caption Screenshots
|
.caption Screenshots
|
||||||
- if params['show'] == 'with'
|
- if params['show'] == 'with'
|
||||||
.item
|
.item
|
||||||
a href=url_for(show: 'without')
|
a href=url_for(show: 'without', search: params[:search])
|
||||||
img src="/images/sidebar/show-without0.svg" width=40 height=40
|
img src="/images/sidebar/show-without0.svg" width=40 height=40
|
||||||
.item
|
.item
|
||||||
img src="/images/sidebar/show-with1.svg" width=40 height=40
|
img src="/images/sidebar/show-with1.svg" width=40 height=40
|
||||||
.item.space
|
.item.space
|
||||||
a href=url_for(show: 'any')
|
a href=url_for(show: 'any', search: params[:search])
|
||||||
img src="/images/sidebar/show-any0.svg" width=40 height=40
|
img src="/images/sidebar/show-any0.svg" width=40 height=40
|
||||||
- elsif params['show'] == 'without'
|
- elsif params['show'] == 'without'
|
||||||
.item
|
.item
|
||||||
img src="/images/sidebar/show-without1.svg" width=40 height=40
|
img src="/images/sidebar/show-without1.svg" width=40 height=40
|
||||||
.item
|
.item
|
||||||
a href=url_for(show: 'with')
|
a href=url_for(show: 'with', search: params[:search])
|
||||||
img src="/images/sidebar/show-with0.svg" width=40 height=40
|
img src="/images/sidebar/show-with0.svg" width=40 height=40
|
||||||
.item.space
|
.item.space
|
||||||
a href=url_for(show: 'any')
|
a href=url_for(show: 'any', search: params[:search])
|
||||||
img src="/images/sidebar/show-any0.svg" width=40 height=40
|
img src="/images/sidebar/show-any0.svg" width=40 height=40
|
||||||
- else # any
|
- else # any
|
||||||
.item
|
.item
|
||||||
a href=url_for(show: 'without')
|
a href=url_for(show: 'without', search: params[:search])
|
||||||
img src="/images/sidebar/show-without0.svg" width=40 height=40
|
img src="/images/sidebar/show-without0.svg" width=40 height=40
|
||||||
.item
|
.item
|
||||||
a href=url_for(show: 'with')
|
a href=url_for(show: 'with', search: params[:search])
|
||||||
img src="/images/sidebar/show-with0.svg" width=40 height=40
|
img src="/images/sidebar/show-with0.svg" width=40 height=40
|
||||||
.item.space
|
.item.space
|
||||||
img src="/images/sidebar/show-any1.svg" width=40 height=40
|
img src="/images/sidebar/show-any1.svg" width=40 height=40
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
' Sorry. I couldn't find any software package like that.
|
' Sorry. I couldn't find any software package like that.
|
||||||
' Would you like to view
|
' Would you like to view
|
||||||
'
|
'
|
||||||
a href=url(:package, :index) all packages
|
a href=url_for(show: params[:show]) all packages
|
||||||
'
|
'
|
||||||
' instead?
|
' instead?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
' Sorry. I couldn't find any software package like that.
|
' Sorry. I couldn't find any software package like that.
|
||||||
' Would you like to view
|
' Would you like to view
|
||||||
'
|
'
|
||||||
a href=url(:package, :index) all packages
|
a href=url_for(show: params[:show]) all packages
|
||||||
'
|
'
|
||||||
' instead?
|
' instead?
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue