outoftime-sunspot 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +9 -6
- data/README.rdoc +45 -13
- data/Rakefile +5 -21
- data/VERSION.yml +4 -0
- data/bin/sunspot-solr +39 -0
- data/lib/sunspot/builder.rb +78 -0
- data/lib/sunspot/dsl/fields.rb +39 -0
- data/lib/sunspot/dsl/query.rb +32 -0
- data/lib/sunspot/dsl/scope.rb +35 -0
- data/lib/sunspot/dsl.rb +3 -0
- data/lib/sunspot/query.rb +9 -20
- data/lib/sunspot/search.rb +8 -25
- data/lib/sunspot.rb +2 -3
- data/solr/etc/jetty.xml +10 -4
- data/solr/solr/conf/{admin-extra.html → elevate.xml} +18 -13
- data/solr/solr/conf/solrconfig.xml +369 -67
- data/solr/webapps/solr.war +0 -0
- data/spec/api/build_search_spec.rb +195 -0
- data/spec/api/indexer_spec.rb +112 -0
- data/spec/api/search_retrieval_spec.rb +59 -0
- data/spec/api/session_spec.rb +44 -0
- data/spec/api/spec_helper.rb +1 -0
- data/spec/api/standard_search_builder_spec.rb +76 -0
- data/{test → spec}/custom_expectation.rb +0 -0
- data/{test/integration/test_field_types.rb → spec/integration/field_types_spec.rb} +9 -9
- data/{test/integration/test_keyword_search.rb → spec/integration/keyword_search_spec.rb} +5 -5
- data/spec/integration/spec_helper.rb +1 -0
- data/{test → spec}/integration/test_pagination.rb +5 -5
- data/{test → spec}/mocks/base_class.rb +0 -0
- data/{test → spec}/mocks/comment.rb +0 -0
- data/{test → spec}/mocks/mock_adapter.rb +0 -0
- data/{test → spec}/mocks/post.rb +0 -0
- data/{test/test_helper.rb → spec/spec_helper.rb} +6 -12
- data/tasks/gemspec.rake +18 -0
- data/tasks/rcov.rake +27 -5
- data/tasks/spec.rake +21 -0
- metadata +90 -125
- data/Manifest.txt +0 -104
- data/PostInstall.txt +0 -7
- data/config/hoe.rb +0 -74
- data/config/requirements.rb +0 -15
- data/lib/sunspot/conditions.rb +0 -50
- data/lib/sunspot/conditions_builder.rb +0 -37
- data/lib/sunspot/field_builder.rb +0 -37
- data/lib/sunspot/query_builder.rb +0 -30
- data/lib/sunspot/scope_builder.rb +0 -33
- data/lib/sunspot/version.rb +0 -10
- data/setup.rb +0 -1585
- data/solr/README.txt +0 -36
- data/solr/exampledocs/books.csv +0 -11
- data/solr/exampledocs/hd.xml +0 -46
- data/solr/exampledocs/ipod_other.xml +0 -50
- data/solr/exampledocs/ipod_video.xml +0 -35
- data/solr/exampledocs/mem.xml +0 -58
- data/solr/exampledocs/monitor.xml +0 -31
- data/solr/exampledocs/monitor2.xml +0 -30
- data/solr/exampledocs/mp500.xml +0 -39
- data/solr/exampledocs/post.jar +0 -0
- data/solr/exampledocs/post.sh +0 -28
- data/solr/exampledocs/sd500.xml +0 -33
- data/solr/exampledocs/solr.xml +0 -38
- data/solr/exampledocs/spellchecker.xml +0 -58
- data/solr/exampledocs/utf8-example.xml +0 -42
- data/solr/exampledocs/vidcard.xml +0 -52
- data/solr/solr/README.txt +0 -52
- data/solr/solr/bin/abc +0 -176
- data/solr/solr/bin/abo +0 -176
- data/solr/solr/bin/backup +0 -108
- data/solr/solr/bin/backupcleaner +0 -142
- data/solr/solr/bin/commit +0 -128
- data/solr/solr/bin/optimize +0 -129
- data/solr/solr/bin/readercycle +0 -129
- data/solr/solr/bin/rsyncd-disable +0 -77
- data/solr/solr/bin/rsyncd-enable +0 -76
- data/solr/solr/bin/rsyncd-start +0 -145
- data/solr/solr/bin/rsyncd-stop +0 -105
- data/solr/solr/bin/scripts-util +0 -83
- data/solr/solr/bin/snapcleaner +0 -148
- data/solr/solr/bin/snapinstaller +0 -168
- data/solr/solr/bin/snappuller +0 -248
- data/solr/solr/bin/snappuller-disable +0 -77
- data/solr/solr/bin/snappuller-enable +0 -77
- data/solr/solr/bin/snapshooter +0 -109
- data/solr/solr/conf/scripts.conf +0 -24
- data/tasks/deployment.rake +0 -34
- data/tasks/environment.rake +0 -7
- data/tasks/solr.rake +0 -12
- data/tasks/website.rake +0 -17
- data/test/api/test_build_search.rb +0 -216
- data/test/api/test_helper.rb +0 -4
- data/test/api/test_indexer.rb +0 -110
- data/test/api/test_retrieve_search.rb +0 -114
- data/test/api/test_session.rb +0 -46
- data/test/integration/test_helper.rb +0 -1
data/History.txt
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
== 0.0.
|
1
|
+
== 0.0.2 2009-02-14
|
2
|
+
* Run sunspot's built-in Solr instance using
|
3
|
+
sunspot-solr executable
|
4
|
+
* Search hash interpretation delegated to
|
5
|
+
Builder object
|
2
6
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
== 0.0.1 2008-12-11
|
8
|
+
* Initial release
|
9
|
+
* Define indexing for any class using DSL
|
10
|
+
* Search indexed classes using DSL
|
data/README.rdoc
CHANGED
@@ -33,6 +33,22 @@ Sunspot is currently under active development and is not feature-complete.
|
|
33
33
|
* Access search parameters as hash or object attributes, for easy integration with form helpers or query string builders
|
34
34
|
* Plugins for drop-in integration with Merb and Rails
|
35
35
|
|
36
|
+
== Installation
|
37
|
+
|
38
|
+
gem sources -a http://gems.github.com
|
39
|
+
gem install outoftime-sunspot
|
40
|
+
|
41
|
+
In order to start the packaged Solr installation, run:
|
42
|
+
|
43
|
+
sunspot-solr start -- [-d /path/to/data/directory] [-p port]
|
44
|
+
|
45
|
+
If you don't specify a data directory, your Solr index will be stored in your operating system's temporary directory.
|
46
|
+
|
47
|
+
You can also run your own instance of Solr wherever you'd like; just copy the solr/config/schema.xml file out of the gem's solr into your installation.
|
48
|
+
You can change the URL at which Sunspot accesses Solr with:
|
49
|
+
|
50
|
+
Sunspot.config.solr.url = 'http://solr.my.host:9818/solr'
|
51
|
+
|
36
52
|
== Using Sunspot
|
37
53
|
|
38
54
|
=== Define an index:
|
@@ -55,40 +71,56 @@ Sunspot is currently under active development and is not feature-complete.
|
|
55
71
|
|
56
72
|
=== Search for objects:
|
57
73
|
|
58
|
-
search = Sunspot.search Post
|
74
|
+
search = Sunspot.search Post do
|
59
75
|
keywords 'great pizza'
|
60
76
|
with.author_name 'Mark Twain'
|
61
77
|
with.blog_id.any_of [2, 14]
|
62
78
|
with.category_ids.all_of [4, 10]
|
63
79
|
with.published_at.less_than Time.now
|
64
80
|
|
65
|
-
conditions.interpret :average_rating, :greater_than
|
66
|
-
conditions.default :average_rating, 4.0
|
67
|
-
|
68
81
|
paginate :page => 3, :per_page => 15
|
69
82
|
order_by :average_rating, :desc
|
70
83
|
end
|
71
84
|
|
72
|
-
=== Get data
|
85
|
+
=== Get data from search:
|
73
86
|
|
74
87
|
search.results
|
75
88
|
search.total
|
76
89
|
search.page
|
77
90
|
search.per_page
|
78
|
-
search.keywords
|
79
|
-
search.conditions.average_rating
|
80
|
-
search.attributes[:conditions]
|
81
91
|
|
82
|
-
|
92
|
+
=== Build search from a hash (e.g., params) and retrieve them later:
|
93
|
+
|
94
|
+
search = Sunspot.search Post, :keywords => 'great pizza',
|
95
|
+
:conditions => { :author_name => 'Mark Twain',
|
96
|
+
:blog_id => [4, 10] },
|
97
|
+
:order => 'published_at desc'
|
98
|
+
search.builder.keywords
|
99
|
+
#=> "great pizza"
|
100
|
+
search.builder.conditions.author_name
|
101
|
+
#=> "Mark Twain"
|
102
|
+
search.builder.params[:conditions][:blog_id]
|
103
|
+
#=> [4, 10]
|
104
|
+
|
105
|
+
This functionality is great for building a search from user input; if you're
|
106
|
+
building a search using business logic in your application, the block DSL
|
107
|
+
is the way to go. Note you can mix-and-match the two:
|
108
|
+
|
109
|
+
search = Sunspot.search Post, :keywords => 'great pizza' do
|
110
|
+
with.blog_id 1
|
111
|
+
end
|
112
|
+
|
113
|
+
search.builder.keywords
|
114
|
+
#=> "great pizza"
|
115
|
+
search.builder.blog_id
|
116
|
+
#=> nil
|
117
|
+
|
118
|
+
== Requirements
|
83
119
|
|
84
120
|
1. extlib
|
85
121
|
2. solr-ruby
|
86
122
|
3. Java
|
87
123
|
|
88
|
-
== INSTALL:
|
89
|
-
|
90
|
-
* FIX (sudo gem install, anything else)
|
91
|
-
|
92
124
|
== LICENSE:
|
93
125
|
|
94
126
|
(The MIT License)
|
data/Rakefile
CHANGED
@@ -1,27 +1,11 @@
|
|
1
|
-
|
2
|
-
require File.dirname(__FILE__) + '/lib/sunspot'
|
1
|
+
require 'rubygems'
|
3
2
|
|
4
3
|
ENV['RUBYOPT'] = '-W1'
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
$hoe = Hoe.new('sunspot', Sunspot::VERSION) do |p|
|
9
|
-
p.developer('Mat Brown', 'mat@patch.com')
|
10
|
-
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
11
|
-
p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
|
12
|
-
p.rubyforge_name = p.name # TODO this is default value
|
13
|
-
# p.extra_deps = [
|
14
|
-
# ['activesupport','>= 2.0.2'],
|
15
|
-
# ]
|
16
|
-
p.extra_dev_deps = [
|
17
|
-
['newgem', ">= #{::Newgem::VERSION}"]
|
18
|
-
]
|
19
|
-
|
20
|
-
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
21
|
-
path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
|
22
|
-
p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
|
23
|
-
p.rsync_args = '-av --delete --ignore-errors'
|
5
|
+
task :environment do
|
6
|
+
require File.dirname(__FILE__) + '/lib/sunspot'
|
24
7
|
end
|
25
8
|
|
26
|
-
require 'newgem/tasks' # load /tasks/*.rake
|
27
9
|
Dir['tasks/**/*.rake'].each { |t| load t }
|
10
|
+
|
11
|
+
task :default => :spec
|
data/VERSION.yml
ADDED
data/bin/sunspot-solr
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
gem 'daemons', '~> 1.0'
|
4
|
+
gem 'optiflag', '~> 0.6.5'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'tmpdir'
|
7
|
+
require 'daemons'
|
8
|
+
require 'optiflag'
|
9
|
+
|
10
|
+
working_directory = FileUtils.pwd
|
11
|
+
solr_home = File.join(File.dirname(__FILE__), '..', 'solr')
|
12
|
+
|
13
|
+
module SolrFlags extend OptiFlagSet
|
14
|
+
optional_flag 'p' do
|
15
|
+
description 'Port on which to run Solr (default 8983)'
|
16
|
+
long_form 'port'
|
17
|
+
end
|
18
|
+
|
19
|
+
optional_flag 'd' do
|
20
|
+
description 'Solr data directory'
|
21
|
+
end
|
22
|
+
|
23
|
+
and_process!
|
24
|
+
end
|
25
|
+
|
26
|
+
port = ARGV.flags.p || '8983'
|
27
|
+
data_dir = File.expand_path(ARGV.flags.d || File.join(Dir.tmpdir, 'solr_data'))
|
28
|
+
|
29
|
+
Daemons.run_proc('sunspot-solr') do
|
30
|
+
FileUtils.cd(working_directory) do
|
31
|
+
FileUtils.cd(solr_home) do
|
32
|
+
args = ['java']
|
33
|
+
args << "-Djetty.port=#{port}" if port
|
34
|
+
args << "-Dsolr.data.dir=#{data_dir}" if data_dir
|
35
|
+
args << '-jar' << 'start.jar'
|
36
|
+
Kernel.exec(*args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Sunspot
|
2
|
+
module Builder
|
3
|
+
class AbstractBuilder
|
4
|
+
attr_reader :search, :types, :field_names
|
5
|
+
|
6
|
+
def initialize(query_dsl, types, field_names)
|
7
|
+
@search, @types, @field_names = query_dsl, types, field_names
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class ParamsBuilder < AbstractBuilder
|
12
|
+
attr_reader :params
|
13
|
+
|
14
|
+
def initialize(query_dsl, types, field_names, params = {})
|
15
|
+
super(query_dsl, types, field_names)
|
16
|
+
@params = params
|
17
|
+
params.each_pair do |field_name, value|
|
18
|
+
self.send("#{field_name}=", value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class StandardBuilder < ParamsBuilder
|
24
|
+
def initialize(query_dsl, types, field_names, params = {})
|
25
|
+
params = { :keywords => nil, :conditions => {}, :order => nil, :page => nil, :per_page => nil }.merge(params)
|
26
|
+
field_names.each { |field_name| params[:conditions][field_name.to_sym] = nil unless params[:conditions].has_key?(field_name.to_sym) }
|
27
|
+
super(query_dsl, types, field_names, params)
|
28
|
+
end
|
29
|
+
|
30
|
+
def keywords=(keywords)
|
31
|
+
search.keywords(keywords) if keywords
|
32
|
+
end
|
33
|
+
|
34
|
+
def conditions=(conditions)
|
35
|
+
conditions.each_pair do |field_name, value|
|
36
|
+
unless value.nil?
|
37
|
+
unless value.is_a?(Array)
|
38
|
+
search.with.send(field_name, value) if field_names.include?(field_name.to_s)
|
39
|
+
else
|
40
|
+
search.with.send(field_name).any_of(value)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def order=(order_string)
|
47
|
+
search.order_by(*order_string.split(' ')) if order_string
|
48
|
+
end
|
49
|
+
|
50
|
+
def page=(page)
|
51
|
+
search.paginate(:page => page, :per_page => params[:per_page]) if page
|
52
|
+
end
|
53
|
+
|
54
|
+
def per_page=(per_page) # ugly
|
55
|
+
end
|
56
|
+
|
57
|
+
def keywords
|
58
|
+
params[:keywords]
|
59
|
+
end
|
60
|
+
|
61
|
+
def conditions
|
62
|
+
::Sunspot::Util::ClosedStruct.new(params[:conditions])
|
63
|
+
end
|
64
|
+
|
65
|
+
def order
|
66
|
+
params[:order]
|
67
|
+
end
|
68
|
+
|
69
|
+
def page
|
70
|
+
params[:page]
|
71
|
+
end
|
72
|
+
|
73
|
+
def per_page
|
74
|
+
params[:per_page]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Sunspot
|
2
|
+
module DSL
|
3
|
+
class Fields
|
4
|
+
def initialize(clazz)
|
5
|
+
@clazz = clazz
|
6
|
+
end
|
7
|
+
|
8
|
+
def text(*names, &block)
|
9
|
+
for name in names
|
10
|
+
::Sunspot::Field.register_text clazz, build_field(name, ::Sunspot::Type::TextType, &block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def method_missing(method, *args, &block)
|
15
|
+
begin
|
16
|
+
type = ::Sunspot::Type.const_get "#{method.to_s.camel_case}Type"
|
17
|
+
rescue(NameError)
|
18
|
+
super(method.to_sym, *args, &block) and return
|
19
|
+
end
|
20
|
+
name = args.shift
|
21
|
+
::Sunspot::Field.register clazz, build_field(name, type, *args, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
attr_reader :clazz
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def build_field(name, type, *args, &block)
|
30
|
+
options = args.shift if args.first.is_a?(Hash)
|
31
|
+
unless block
|
32
|
+
::Sunspot::Field::AttributeField.new(name, type, options || {})
|
33
|
+
else
|
34
|
+
::Sunspot::Field::VirtualField.new(name, type, options || {}, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Sunspot
|
2
|
+
module DSL
|
3
|
+
class Query
|
4
|
+
def initialize(query)
|
5
|
+
@query = query
|
6
|
+
end
|
7
|
+
|
8
|
+
def keywords(keywords)
|
9
|
+
@query.keywords = keywords
|
10
|
+
end
|
11
|
+
|
12
|
+
def with
|
13
|
+
@conditions_builder ||= ::Sunspot::DSL::Scope.new(@query)
|
14
|
+
end
|
15
|
+
|
16
|
+
def conditions
|
17
|
+
@query.conditions
|
18
|
+
end
|
19
|
+
|
20
|
+
def paginate(options = {})
|
21
|
+
page = options.delete(:page) || raise(ArgumentError, "paginate requires a :page argument")
|
22
|
+
per_page = options.delete(:per_page)
|
23
|
+
raise ArgumentError, "unknown argument #{options.keys.first.inspect} passed to paginate" unless options.empty?
|
24
|
+
@query.paginate(page, per_page)
|
25
|
+
end
|
26
|
+
|
27
|
+
def order_by(field_name, direction = nil)
|
28
|
+
@query.order_by(field_name, direction)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Sunspot
|
2
|
+
module DSL
|
3
|
+
class Scope
|
4
|
+
def initialize(query)
|
5
|
+
@query = query
|
6
|
+
end
|
7
|
+
|
8
|
+
def method_missing(field_name, *args)
|
9
|
+
if args.length == 0 then RestrictionBuilder.new(field_name, @query)
|
10
|
+
elsif args.length == 1 then @query.add_scope @query.build_condition(field_name, ::Sunspot::Restriction::EqualTo, args.first)
|
11
|
+
else super(field_name.to_sym, *args)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class RestrictionBuilder
|
16
|
+
def initialize(field_name, query)
|
17
|
+
@field_name, @query = field_name, query
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_missing(condition_name, *args)
|
21
|
+
clazz = begin
|
22
|
+
::Sunspot::Restriction.const_get(condition_name.to_s.camel_case)
|
23
|
+
rescue(NameError)
|
24
|
+
super(condition_name.to_sym, *args)
|
25
|
+
end
|
26
|
+
if value = args.first
|
27
|
+
@query.add_scope @query.build_condition(@field_name, clazz, args.first)
|
28
|
+
else
|
29
|
+
@query.interpret_condition @field_name, clazz
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/sunspot/dsl.rb
ADDED
data/lib/sunspot/query.rb
CHANGED
@@ -3,14 +3,8 @@ module Sunspot
|
|
3
3
|
attr_accessor :keywords, :conditions, :rows, :start, :sort
|
4
4
|
|
5
5
|
def initialize(types, params, configuration)
|
6
|
-
@
|
7
|
-
|
8
|
-
paginate(params[:page], params[:per_page])
|
9
|
-
self.order = params[:order] if params[:order]
|
10
|
-
attributes[:keywords] = @keywords
|
11
|
-
params[:conditions].each_pair do |field_name, value|
|
12
|
-
attributes[:conditions][field_name.to_sym] = value
|
13
|
-
end if params[:conditions]
|
6
|
+
@types, @configuration = types, configuration
|
7
|
+
paginate
|
14
8
|
end
|
15
9
|
|
16
10
|
def to_solr
|
@@ -21,7 +15,7 @@ module Sunspot
|
|
21
15
|
end
|
22
16
|
|
23
17
|
def filter_queries
|
24
|
-
scope_queries
|
18
|
+
scope_queries
|
25
19
|
end
|
26
20
|
|
27
21
|
def add_scope(condition)
|
@@ -37,7 +31,6 @@ module Sunspot
|
|
37
31
|
per_page ||= configuration.pagination.default_per_page
|
38
32
|
@start = (page - 1) * per_page
|
39
33
|
@rows = per_page
|
40
|
-
attributes[:page], attributes[:per_page] = page, per_page
|
41
34
|
end
|
42
35
|
|
43
36
|
def order=(order)
|
@@ -47,7 +40,6 @@ module Sunspot
|
|
47
40
|
def order_by(field_name, direction = nil)
|
48
41
|
direction ||= :asc
|
49
42
|
@sort = [{ field(field_name).indexed_name.to_sym => (direction.to_s == 'asc' ? :ascending : :descending) }] #TODO should support multiple order columns
|
50
|
-
attributes[:order] = "#{field_name} #{direction}"
|
51
43
|
end
|
52
44
|
|
53
45
|
def page
|
@@ -55,11 +47,12 @@ module Sunspot
|
|
55
47
|
start / rows + 1
|
56
48
|
end
|
57
49
|
|
58
|
-
def
|
59
|
-
@
|
60
|
-
|
61
|
-
|
62
|
-
|
50
|
+
def dsl
|
51
|
+
@dsl ||= ::Sunspot::DSL::Query.new(self)
|
52
|
+
end
|
53
|
+
|
54
|
+
def build_with(builder_class, *args)
|
55
|
+
builder_class.new(dsl, types, fields_hash.keys, *args)
|
63
56
|
end
|
64
57
|
|
65
58
|
alias_method :per_page, :rows
|
@@ -77,10 +70,6 @@ module Sunspot
|
|
77
70
|
scope.map { |condition| condition.to_solr_query }
|
78
71
|
end
|
79
72
|
|
80
|
-
def condition_queries
|
81
|
-
conditions.restrictions.map { |condition| condition.to_solr_query }
|
82
|
-
end
|
83
|
-
|
84
73
|
def types_query
|
85
74
|
if types.nil? || types.empty? then "type:[* TO *]"
|
86
75
|
elsif types.length == 1 then "type:#{types.first}"
|
data/lib/sunspot/search.rb
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
module Sunspot
|
2
2
|
class Search
|
3
|
+
attr_reader :builder
|
4
|
+
|
3
5
|
def initialize(connection, configuration, *types, &block)
|
4
6
|
@connection = connection
|
5
7
|
params = types.last.is_a?(Hash) ? types.pop : {}
|
6
8
|
@query = Sunspot::Query.new(types, params, configuration)
|
7
|
-
|
9
|
+
@builder = build_with(::Sunspot::Builder::StandardBuilder, params)
|
10
|
+
@query.dsl.instance_eval(&block) if block
|
8
11
|
@types = types
|
9
12
|
end
|
10
13
|
|
14
|
+
def build_with(builder_class, *args)
|
15
|
+
@query.build_with(builder_class, *args)
|
16
|
+
end
|
17
|
+
|
11
18
|
def execute!
|
12
19
|
query_options = {}
|
13
20
|
query_options[:filter_queries] = query.filter_queries
|
@@ -32,30 +39,6 @@ module Sunspot
|
|
32
39
|
@total ||= @solr_result.total_hits
|
33
40
|
end
|
34
41
|
|
35
|
-
def attributes
|
36
|
-
@query.attributes
|
37
|
-
end
|
38
|
-
|
39
|
-
def order
|
40
|
-
@query.attributes[:order]
|
41
|
-
end
|
42
|
-
|
43
|
-
def page
|
44
|
-
@query.attributes[:page]
|
45
|
-
end
|
46
|
-
|
47
|
-
def per_page
|
48
|
-
@query.attributes[:per_page]
|
49
|
-
end
|
50
|
-
|
51
|
-
def keywords
|
52
|
-
@query.attributes[:keywords]
|
53
|
-
end
|
54
|
-
|
55
|
-
def conditions
|
56
|
-
::Sunspot::Util::ClosedStruct.new(@query.attributes[:conditions])
|
57
|
-
end
|
58
|
-
|
59
42
|
protected
|
60
43
|
attr_reader :query, :types, :connection
|
61
44
|
|
data/lib/sunspot.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
gem 'solr-ruby'
|
3
2
|
gem 'extlib'
|
4
3
|
require 'solr'
|
5
4
|
require 'extlib'
|
6
5
|
require File.join(File.dirname(__FILE__), 'light_config')
|
7
6
|
|
8
|
-
%w(adapters restriction
|
7
|
+
%w(adapters builder restriction configuration field indexer query search session type util dsl).each do |filename|
|
9
8
|
require File.join(File.dirname(__FILE__), 'sunspot', filename)
|
10
9
|
end
|
11
10
|
|
@@ -15,7 +14,7 @@ end
|
|
15
14
|
|
16
15
|
class <<Sunspot
|
17
16
|
def setup(clazz, &block)
|
18
|
-
::Sunspot::
|
17
|
+
::Sunspot::DSL::Fields.new(clazz).instance_eval(&block) if block
|
19
18
|
end
|
20
19
|
|
21
20
|
def index(*objects)
|
data/solr/etc/jetty.xml
CHANGED
@@ -12,6 +12,12 @@
|
|
12
12
|
|
13
13
|
<Configure id="Server" class="org.mortbay.jetty.Server">
|
14
14
|
|
15
|
+
<!-- Increase the maximum POST size to 1 MB to be able to handle large shard requests -->
|
16
|
+
<Call class="java.lang.System" name="setProperty">
|
17
|
+
<Arg>org.mortbay.jetty.Request.maxFormContentSize</Arg>
|
18
|
+
<Arg>1000000</Arg>
|
19
|
+
</Call>
|
20
|
+
|
15
21
|
<!-- =========================================================== -->
|
16
22
|
<!-- Server Thread Pool -->
|
17
23
|
<!-- =========================================================== -->
|
@@ -21,7 +27,7 @@
|
|
21
27
|
<New class="org.mortbay.thread.BoundedThreadPool">
|
22
28
|
<Set name="minThreads">10</Set>
|
23
29
|
<Set name="lowThreads">50</Set>
|
24
|
-
<Set name="maxThreads">
|
30
|
+
<Set name="maxThreads">10000</Set>
|
25
31
|
</New>
|
26
32
|
|
27
33
|
<!-- Optional Java 5 bounded threadpool with job queue
|
@@ -64,7 +70,7 @@
|
|
64
70
|
<Call name="addConnector">
|
65
71
|
<Arg>
|
66
72
|
<New class="org.mortbay.jetty.bio.SocketConnector">
|
67
|
-
<Set name="port"
|
73
|
+
<Set name="port"><SystemProperty name="jetty.port" default="8983"/></Set>
|
68
74
|
<Set name="maxIdleTime">50000</Set>
|
69
75
|
<Set name="lowResourceMaxIdleTime">1500</Set>
|
70
76
|
</New>
|
@@ -185,13 +191,13 @@
|
|
185
191
|
<!-- =========================================================== -->
|
186
192
|
<Ref id="RequestLog">
|
187
193
|
<Set name="requestLog">
|
188
|
-
|
194
|
+
<!-- New id="RequestLogImpl" class="org.mortbay.jetty.NCSARequestLog">
|
189
195
|
<Arg><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.request.log</Arg>
|
190
196
|
<Set name="retainDays">90</Set>
|
191
197
|
<Set name="append">true</Set>
|
192
198
|
<Set name="extended">false</Set>
|
193
199
|
<Set name="LogTimeZone">GMT</Set>
|
194
|
-
</New
|
200
|
+
</New -->
|
195
201
|
</Set>
|
196
202
|
</Ref>
|
197
203
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
1
2
|
<!--
|
2
3
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
3
4
|
contributor license agreements. See the NOTICE file distributed with
|
@@ -15,17 +16,21 @@
|
|
15
16
|
limitations under the License.
|
16
17
|
-->
|
17
18
|
|
18
|
-
<!--
|
19
|
-
|
20
|
-
will
|
21
|
-
|
22
|
-
<hr>
|
23
|
-
<i>This line will appear before the first table</i>
|
24
|
-
<tr>
|
25
|
-
<td colspan="2">
|
26
|
-
This row will be appended to the end of the first table
|
27
|
-
</td>
|
28
|
-
</tr>
|
29
|
-
<hr>
|
30
|
-
|
19
|
+
<!-- If this file is found in the config directory, it will only be
|
20
|
+
loaded once at startup. If it is found in Solr's data
|
21
|
+
directory, it will be re-loaded every commit.
|
31
22
|
-->
|
23
|
+
|
24
|
+
<elevate>
|
25
|
+
<query text="foo bar">
|
26
|
+
<doc id="1" />
|
27
|
+
<doc id="2" />
|
28
|
+
<doc id="3" />
|
29
|
+
</query>
|
30
|
+
|
31
|
+
<query text="ipod">
|
32
|
+
<doc id="MA147LL/A" /> <!-- put the actual ipod at the top -->
|
33
|
+
<doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
|
34
|
+
</query>
|
35
|
+
|
36
|
+
</elevate>
|