Commit 4e977f084e556e9eb52682d4c0e52ad2a8a3f617
1 parent
0c822dbe
Exists in
master
and in
29 other branches
Update acts_as_solr_reloaded with upstream changes
Showing
7 changed files
with
63 additions
and
55 deletions
Show diff stats
vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr.rb
... | ... | @@ -27,6 +27,10 @@ module ActsAsSolr |
27 | 27 | @config ||= YAML::load_file("#{Rails.root}/config/solr.yml")[Rails.env] |
28 | 28 | end |
29 | 29 | |
30 | + def options | |
31 | + @options ||= credentials.merge( :timeout => config['timeout'] ) | |
32 | + end | |
33 | + | |
30 | 34 | def credentials |
31 | 35 | @credentials ||= {:username => config['username'], :password => config['password']} |
32 | 36 | end |
... | ... | @@ -36,7 +40,7 @@ module ActsAsSolr |
36 | 40 | end |
37 | 41 | |
38 | 42 | def execute(request, core = nil) |
39 | - connection = Solr::Connection.new(url(core), credentials) | |
43 | + connection = Solr::Connection.new(url(core), options) | |
40 | 44 | connection.send request |
41 | 45 | end |
42 | 46 | end | ... | ... |
vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/class_methods.rb
... | ... | @@ -13,13 +13,17 @@ module ActsAsSolr #:nodoc: |
13 | 13 | # results = Book.find_by_solr params[:query] |
14 | 14 | # end |
15 | 15 | # |
16 | - # You can also search for specific fields by searching for 'field:value' | |
16 | + # For specific fields searching use :filter_queries options | |
17 | 17 | # |
18 | 18 | # ====options: |
19 | 19 | # offset:: - The first document to be retrieved (offset) |
20 | 20 | # page:: - The page to be retrieved |
21 | 21 | # limit:: - The number of rows per page |
22 | 22 | # per_page:: - Alias for limit |
23 | + # filter_queries:: - Use solr filter queries to sort by fields | |
24 | + # | |
25 | + # Book.find_by_solr 'ruby', :filter_queries => ['price:5'] | |
26 | + # | |
23 | 27 | # order:: - Orders (sort by) the result set using a given criteria: |
24 | 28 | # |
25 | 29 | # Book.find_by_solr 'ruby', :order => 'description asc' | ... | ... |
vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb
... | ... | @@ -5,28 +5,21 @@ module ActsAsSolr #:nodoc: |
5 | 5 | # Converts field types into Solr types |
6 | 6 | def get_solr_field_type(field_type) |
7 | 7 | if field_type.is_a?(Symbol) |
8 | - case field_type | |
9 | - when :float, :decimal | |
10 | - return "f" | |
11 | - when :integer | |
12 | - return "i" | |
13 | - when :boolean | |
14 | - return "b" | |
15 | - when :string | |
16 | - return "s" | |
17 | - when :date | |
18 | - return "d" | |
19 | - when :range_float | |
20 | - return "rf" | |
21 | - when :range_integer | |
22 | - return "ri" | |
23 | - when :facet | |
24 | - return "facet" | |
25 | - when :text | |
26 | - return "t" | |
27 | - else | |
28 | - raise "Unknown field_type symbol: #{field_type}" | |
29 | - end | |
8 | + h = { | |
9 | + :float => "f", | |
10 | + :decimal => "f", | |
11 | + :integer => "i", | |
12 | + :boolean => "b", | |
13 | + :string => "s", | |
14 | + :date => "d", | |
15 | + :range_float => "rf", | |
16 | + :range_integer => "ri", | |
17 | + :facet => "facet", | |
18 | + :text => "t", | |
19 | + } | |
20 | + t = h[field_type] | |
21 | + raise "Unknown field_type symbol: #{field_type}" if t.nil? | |
22 | + t | |
30 | 23 | elsif field_type.is_a?(String) |
31 | 24 | return field_type |
32 | 25 | else | ... | ... |
vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb
... | ... | @@ -4,13 +4,24 @@ module ActsAsSolr #:nodoc: |
4 | 4 | |
5 | 5 | # Method used by mostly all the ClassMethods when doing a search |
6 | 6 | def parse_query(query=nil, options={}, models=nil) |
7 | - valid_options = [ :offset, :limit, :facets, :models, :results_format, :order, | |
8 | - :scores, :operator, :include, :lazy, :joins, :select, :core, | |
9 | - :around, :relevance, :highlight, :page, :per_page] | |
7 | + valid_options = [ :filter_queries, :offset, :limit, :facets, :models, :results_format, :order, | |
8 | + :scores, :operator, :include, :lazy, :joins, :select, :core, | |
9 | + :around, :relevance, :highlight, :page, :per_page] | |
10 | 10 | query_options = {} |
11 | - query = sanitize_query(query) if query | |
12 | - return nil if (query.nil? || query.strip == '') | |
13 | - | |
11 | + | |
12 | + field_list = models.nil? ? solr_configuration[:primary_key_field] : "id" | |
13 | + query_options[:field_list] = [field_list, 'score'] | |
14 | + query_options[:filter_queries] = [] | |
15 | + #allow empty queries as a type search will also be done | |
16 | + query = nil if (query.nil? || query == '') | |
17 | + if query.nil? | |
18 | + query = solr_type_condition | |
19 | + else | |
20 | + query = sanitize_query(query) | |
21 | + query_options[:filter_queries].push(solr_type_condition) | |
22 | + end | |
23 | + query_options[:query] = query | |
24 | + order = options[:order].split(/\s*,\s*/).collect{|e| e.gsub(/\s+/,'_t ').gsub(/\bscore_t\b/, 'score') }.join(',') if options[:order] | |
14 | 25 | |
15 | 26 | raise "Invalid parameters: #{(options.keys - valid_options).join(',')}" unless (options.keys - valid_options).empty? |
16 | 27 | begin |
... | ... | @@ -23,6 +34,9 @@ module ActsAsSolr #:nodoc: |
23 | 34 | |
24 | 35 | query = add_relevance query, options[:relevance] |
25 | 36 | |
37 | + raise "Expecting and array of strings for :filter_queries" unless options[:filter_queries].nil? or options[:filter_queries].kind_of?(Array) | |
38 | + query_options[:filter_queries] = replace_types([*options[:filter_queries]].collect{|k| "#{k.sub!(/ *: */,"_t:")}"}) if options[:filter_queries] | |
39 | + | |
26 | 40 | # first steps on the facet parameter processing |
27 | 41 | if options[:facets] |
28 | 42 | query_options[:facets] = {} |
... | ... | @@ -33,7 +47,7 @@ module ActsAsSolr #:nodoc: |
33 | 47 | # override the :zeros (it's deprecated anyway) if :mincount exists |
34 | 48 | query_options[:facets][:mincount] = options[:facets][:mincount] if options[:facets][:mincount] |
35 | 49 | query_options[:facets][:fields] = options[:facets][:fields].collect{|k| "#{k}_facet"} if options[:facets][:fields] |
36 | - query_options[:filter_queries] = replace_types([*options[:facets][:browse]].collect{|k| "#{k.sub!(/ *: */,"_facet:")}"}) if options[:facets][:browse] | |
50 | + query_options[:filter_queries] += replace_types([*options[:facets][:browse]].collect{|k| "#{k.sub!(/ *: */,"_t:")}"}) if options[:facets][:browse] | |
37 | 51 | query_options[:facets][:queries] = replace_types(options[:facets][:query].collect{|k| "#{k.sub!(/ *: */,"_t:")}"}) if options[:facets][:query] |
38 | 52 | |
39 | 53 | |
... | ... | @@ -68,19 +82,6 @@ module ActsAsSolr #:nodoc: |
68 | 82 | end |
69 | 83 | end |
70 | 84 | |
71 | - if models.nil? | |
72 | - # TODO: use a filter query for type, allowing Solr to cache it individually | |
73 | - models = "AND #{solr_type_condition}" | |
74 | - field_list = solr_configuration[:primary_key_field] | |
75 | - else | |
76 | - field_list = "id" | |
77 | - end | |
78 | - | |
79 | - query_options[:field_list] = [field_list, 'score'] | |
80 | - query = "(#{query.gsub(/ *: */,"_t:")}) #{models}" | |
81 | - order = options[:order].split(/\s*,\s*/).collect{|e| e.gsub(/\s+/,'_t ').gsub(/\bscore_t\b/, 'score') }.join(',') if options[:order] | |
82 | - query_options[:query] = replace_types([query])[0] # TODO adjust replace_types to work with String or Array | |
83 | - | |
84 | 85 | if options[:highlight] |
85 | 86 | query_options[:highlighting] = {} |
86 | 87 | query_options[:highlighting][:field_list] = [] |
... | ... | @@ -232,9 +233,8 @@ module ActsAsSolr #:nodoc: |
232 | 233 | raise "Invalid option#{'s' if bad_options.size > 1} for faceted date's other param: #{bad_options.join(', ')}. May only be one of :after, :all, :before, :between, :none" if bad_options.size > 0 |
233 | 234 | end |
234 | 235 | |
235 | - # Remove all leading ?'s and *'s from query | |
236 | 236 | def sanitize_query(query) |
237 | - query.gsub(/\A([\?|\*| ]+)/, '') | |
237 | + Solr::Util::query_parser_escape query | |
238 | 238 | end |
239 | 239 | |
240 | 240 | private | ... | ... |
vendor/plugins/acts_as_solr_reloaded/lib/solr/request/select.rb
... | ... | @@ -33,7 +33,7 @@ class Solr::Request::Select < Solr::Request::Base |
33 | 33 | end |
34 | 34 | |
35 | 35 | def to_hash |
36 | - return {:qt => query_type, :wt => 'ruby'}.merge(@select_params) | |
36 | + return {:qt => query_type, :wt => 'ruby', 'json.nl' => 'arrarr'}.merge(@select_params) | |
37 | 37 | end |
38 | 38 | |
39 | 39 | def to_s | ... | ... |
vendor/plugins/acts_as_solr_reloaded/lib/solr/response/standard.rb
vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake
1 | 1 | namespace :solr do |
2 | 2 | |
3 | - desc 'Download and install Solr+Jetty 3.3.0.' | |
3 | + SOLR_VERSION = '3.3.0' | |
4 | + APACHE_MIRROR = "http://ftp.unicamp.br/pub/apache" | |
5 | + SOLR_FILENAME = "apache-solr-#{SOLR_VERSION}.tgz" | |
6 | + SOLR_DIR = "apache-solr-#{SOLR_VERSION}" | |
7 | + SOLR_URL = "#{APACHE_MIRROR}/lucene/solr/#{SOLR_VERSION}/#{SOLR_FILENAME}" | |
8 | + | |
9 | + desc "Download and install Solr+Jetty #{SOLR_VERSION}." | |
4 | 10 | task :download do |
5 | - if (File.exists?(Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr/start.jar')) | |
11 | + if File.exists?(Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr/start.jar') | |
6 | 12 | puts 'Solr already downloaded.' |
7 | 13 | else |
8 | 14 | cd '/tmp' |
9 | - sh 'wget -c http://ftp.unicamp.br/pub/apache/lucene/solr/3.3.0/apache-solr-3.3.0.tgz' | |
10 | - sh 'tar xzf apache-solr-3.3.0.tgz' | |
11 | - cd 'apache-solr-3.3.0/example' | |
15 | + sh "wget -c #{SOLR_URL}" | |
16 | + if !File.directory?("/tmp/#{SOLR_DIR}") | |
17 | + sh "tar xzf apache-solr-#{SOLR_VERSION}.tgz" | |
18 | + end | |
19 | + cd "apache-solr-#{SOLR_VERSION}/example" | |
12 | 20 | cp_r ['../LICENSE.txt', '../NOTICE.txt', 'README.txt', 'etc', 'lib', 'start.jar', 'webapps', 'work'], Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr', :verbose => true |
13 | 21 | cd 'solr' |
14 | 22 | cp_r ['README.txt', 'bin', 'solr.xml'], Rails.root + '/vendor/plugins/acts_as_solr_reloaded/solr/solr', :verbose => true |
... | ... | @@ -27,7 +35,7 @@ namespace :solr do |
27 | 35 | end |
28 | 36 | |
29 | 37 | desc 'Starts Solr. Options accepted: RAILS_ENV=your_env, PORT=XX. Defaults to development if none.' |
30 | - task :start => :environment do | |
38 | + task :start => [:download, :environment] do | |
31 | 39 | require File.expand_path("#{File.dirname(__FILE__)}/../../config/solr_environment") |
32 | 40 | FileUtils.mkdir_p(SOLR_LOGS_PATH) |
33 | 41 | FileUtils.mkdir_p(SOLR_DATA_PATH) |
... | ... | @@ -62,7 +70,7 @@ namespace :solr do |
62 | 70 | end |
63 | 71 | |
64 | 72 | desc 'Stops Solr. Specify the environment by using: RAILS_ENV=your_env. Defaults to development if none.' |
65 | - task :stop=> :environment do | |
73 | + task :stop => :environment do | |
66 | 74 | require File.expand_path("#{File.dirname(__FILE__)}/../../config/solr_environment") |
67 | 75 | fork do |
68 | 76 | if File.exists?(SOLR_PID_FILE) | ... | ... |