cb_sunspot_solr 2.0.0.pre2

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.
Files changed (44) hide show
  1. data/Gemfile +3 -0
  2. data/README.rdoc +24 -0
  3. data/bin/sunspot-installer +20 -0
  4. data/bin/sunspot-solr +80 -0
  5. data/lib/sunspot/solr/installer/config_installer.rb +46 -0
  6. data/lib/sunspot/solr/installer/task_helper.rb +13 -0
  7. data/lib/sunspot/solr/installer.rb +25 -0
  8. data/lib/sunspot/solr/java.rb +10 -0
  9. data/lib/sunspot/solr/railtie.rb +15 -0
  10. data/lib/sunspot/solr/server.rb +224 -0
  11. data/lib/sunspot/solr/tasks.rb +49 -0
  12. data/lib/sunspot_solr.rb +5 -0
  13. data/solr/README.txt +42 -0
  14. data/solr/etc/jetty.xml +219 -0
  15. data/solr/etc/webdefault.xml +379 -0
  16. data/solr/lib/jetty-6.1.26-patched-JETTY-1340.jar +0 -0
  17. data/solr/lib/jetty-util-6.1.26-patched-JETTY-1340.jar +0 -0
  18. data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  19. data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
  20. data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
  21. data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  22. data/solr/lib/servlet-api-2.5-20081211.jar +0 -0
  23. data/solr/solr/.gitignore +1 -0
  24. data/solr/solr/README.txt +54 -0
  25. data/solr/solr/conf/admin-extra.html +31 -0
  26. data/solr/solr/conf/elevate.xml +36 -0
  27. data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  28. data/solr/solr/conf/protwords.txt +21 -0
  29. data/solr/solr/conf/schema.xml +238 -0
  30. data/solr/solr/conf/scripts.conf +24 -0
  31. data/solr/solr/conf/solrconfig.xml +934 -0
  32. data/solr/solr/conf/spellings.txt +2 -0
  33. data/solr/solr/conf/stopwords.txt +58 -0
  34. data/solr/solr/conf/synonyms.txt +31 -0
  35. data/solr/solr/conf/xslt/example.xsl +132 -0
  36. data/solr/solr/conf/xslt/example_atom.xsl +67 -0
  37. data/solr/solr/conf/xslt/example_rss.xsl +66 -0
  38. data/solr/solr/conf/xslt/luke.xsl +337 -0
  39. data/solr/start.jar +0 -0
  40. data/solr/webapps/solr.war +0 -0
  41. data/spec/server_spec.rb +98 -0
  42. data/spec/spec_helper.rb +18 -0
  43. data/sunspot_solr.gemspec +39 -0
  44. metadata +151 -0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,24 @@
1
+ = Sunspot::Solr
2
+
3
+ Sunspot::Solr is a packaged distribution of Solr for use with the
4
+ Sunspot[http://outoftime.github.com/sunspot] and
5
+ Sunspot::Rails[https://github.com/outoftime/sunspot/tree/master/sunspot_rails]
6
+ gems. See those gems' documentation for more information.
7
+
8
+ == Installation
9
+
10
+ gem install sunspot_solr
11
+
12
+ In order to start the daemon, run:
13
+
14
+ sunspot-solr start -- [-d /path/to/data/directory] [-p port] [-s path/to/solr/home] [--pid-dir=path/to/pid/dir]
15
+
16
+ If you don't specify a data directory, your Solr index will be stored in your
17
+ operating system's temporary directory.
18
+
19
+ If you specify a solr home, the directory must contain a <code>conf</code>
20
+ directory, which should contain at least <code>schema.xml</code> and
21
+ <code>solrconfig.xml</code>. Be sure to copy the <code>schema.xml</code> out of
22
+ the Sunspot gem's <code>solr/solr/conf</code> directory. Sunspot relies on the
23
+ field name patterns defined in the packaged <code>schema.xml</code>, so those
24
+ cannot be modified.
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'sunspot', 'solr', 'installer')
5
+
6
+ home = ARGV.select { |arg| arg !~ /^-/ }.last || File.join(Dir.pwd, "solr")
7
+ options = {}
8
+
9
+ OptionParser.new do |opts|
10
+ opts.banner = "Usage: sunspot-installer [options] [solr-home]"
11
+ opts.on('-v', '--[no-]verbose', 'Run verbosely') do |v|
12
+ options[:verbose] = v
13
+ end
14
+ opts.on('-f', '--[no-]force', 'Overwrite schema and solrconfig files with Sunspot default, instead of modifying them (recommended for new Solr installation)') do |f|
15
+ options[:force] = f
16
+ end
17
+ end.parse!
18
+
19
+ Sunspot::Solr::Installer.execute(home, options)
20
+ puts "Installed to #{home}"
data/bin/sunspot-solr ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+ begin
3
+ require 'fileutils'
4
+ require 'tempfile'
5
+ require 'tmpdir'
6
+ require 'optparse'
7
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'sunspot', 'solr', 'server')
8
+ rescue LoadError => e
9
+ if require 'rubygems'
10
+ retry
11
+ else
12
+ raise(e)
13
+ end
14
+ end
15
+
16
+ server = Sunspot::Solr::Server.new
17
+
18
+ opts = OptionParser.new do |opts|
19
+ opts.banner = "Usage: sunspot-solr (start|stop|run) [options]"
20
+
21
+ opts.on '-p', '--port=PORT', 'Port on which to run Solr (default 8983)' do |p|
22
+ server.port = p
23
+ end
24
+
25
+ opts.on '-b', '--bind-address=address', 'Interface on which to run Solr (default 0.0.0.0)' do |b|
26
+ server.bind_address = b
27
+ end
28
+
29
+ opts.on '-d', '--data-directory=DIRECTORY', 'Solr data directory' do |d|
30
+ server.solr_data_dir = File.expand_path(d)
31
+ end
32
+
33
+ opts.on '-s', '--solr-home=HOME', 'Solr home directory (should contain conf/ directory)' do |s|
34
+ server.solr_home = File.expand_path(s)
35
+ end
36
+
37
+ opts.on '-j', '--solr-jar=JAR', 'Solr start jar' do |j|
38
+ server.solr_jar = File.expand_path(j)
39
+ end
40
+
41
+ opts.on '--pid-dir=PID_DIR', 'Directory for pid files' do |pd|
42
+ server.pid_dir = File.expand_path(pd)
43
+ end
44
+
45
+ opts.on '-l', '--log-level=LOG_LEVEL', 'Solr logging level' do |l|
46
+ server.log_level = l
47
+ end
48
+
49
+ opts.on '--log-file=LOG_FILE', 'Path to Solr log file' do |lf|
50
+ server.log_file = File.expand_path(lf)
51
+ end
52
+
53
+ opts.on '--max-memory=MEMORY', 'Specify the maximum size of the memory allocation pool' do |mm|
54
+ server.max_memory = mm
55
+ end
56
+
57
+ opts.on '--min-memory=MEMORY', 'Specify the initial size of the memory allocation pool' do |mm|
58
+ server.min_memory = mm
59
+ end
60
+ end
61
+
62
+ opts.parse!
63
+
64
+ begin
65
+ case ARGV[0]
66
+ when 'start'
67
+ server.start
68
+ when 'run'
69
+ server.run
70
+ when 'stop'
71
+ server.stop
72
+ when 'restart'
73
+ server.stop
74
+ server.start
75
+ else
76
+ abort(opts.help)
77
+ end
78
+ rescue Sunspot::Solr::Server::ServerError => e
79
+ abort(e.message)
80
+ end
@@ -0,0 +1,46 @@
1
+ require 'fileutils'
2
+
3
+ module Sunspot
4
+ module Solr
5
+ class Installer
6
+ class ConfigInstaller
7
+ include TaskHelper
8
+
9
+ class <<self
10
+ def execute(config_path, options = {})
11
+ new(config_path, options).execute
12
+ end
13
+ end
14
+
15
+ def initialize(config_path, options)
16
+ @config_path = config_path
17
+ @verbose = !!options[:verbose]
18
+ @force = !!options[:force]
19
+ end
20
+
21
+ def execute
22
+ sunspot_config_path = File.join(File.dirname(__FILE__), '..', '..',
23
+ '..', '..', 'solr', 'solr', 'conf')
24
+ return if File.expand_path(sunspot_config_path) == File.expand_path(@config_path)
25
+
26
+ FileUtils.mkdir_p(@config_path)
27
+ Dir.glob(File.join(sunspot_config_path, '*.*')).each do |file|
28
+ file = File.expand_path(file)
29
+ dest = File.join(@config_path, File.basename(file))
30
+
31
+ if File.exist?(dest)
32
+ if @force
33
+ say("Removing existing file #{dest}")
34
+ else
35
+ next
36
+ end
37
+ end
38
+
39
+ say("Copying #{file} => #{dest}")
40
+ FileUtils.cp(file, dest)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ module Sunspot
2
+ module Solr
3
+ class Installer
4
+ module TaskHelper
5
+ def say(message)
6
+ if @verbose
7
+ STDOUT.puts(message)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ %w(task_helper config_installer).each do |file|
2
+ require File.join(File.dirname(__FILE__), 'installer', file)
3
+ end
4
+
5
+ module Sunspot
6
+ module Solr
7
+ class Installer
8
+ class <<self
9
+ def execute(solr_home, options = {})
10
+ new(solr_home, options).execute
11
+ end
12
+
13
+ private :new
14
+ end
15
+
16
+ def initialize(solr_home, options)
17
+ @solr_home, @options = solr_home, options
18
+ end
19
+
20
+ def execute
21
+ ConfigInstaller.execute(File.join(@solr_home, 'conf'), @options)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ module Sunspot
2
+ module Solr
3
+ module Java
4
+ def self.installed?
5
+ `java -version &> /dev/null`
6
+ $?.success?
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ module Sunspot
2
+ module Solr
3
+ class Railtie < ::Rails::Railtie
4
+
5
+ rake_tasks do
6
+ load 'sunspot/solr/tasks.rb'
7
+ end
8
+
9
+ # generators do
10
+ # load "generators/sunspot_rails.rb"
11
+ # end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,224 @@
1
+ require 'escape'
2
+ require 'set'
3
+ require 'tempfile'
4
+ require 'sunspot/solr/java'
5
+ require 'sunspot/solr/installer'
6
+
7
+ module Sunspot
8
+ module Solr
9
+ class Server #:nodoc:
10
+ # Raised if #stop is called but the server is not running
11
+ ServerError = Class.new(RuntimeError)
12
+ AlreadyRunningError = Class.new(ServerError)
13
+ NotRunningError = Class.new(ServerError)
14
+ JavaMissing = Class.new(ServerError)
15
+
16
+ # Name of the sunspot executable (shell script)
17
+ SOLR_START_JAR = File.expand_path(
18
+ File.join(File.dirname(__FILE__), '..', '..', '..', 'solr', 'start.jar')
19
+ )
20
+
21
+ LOG_LEVELS = Set['SEVERE', 'WARNING', 'INFO', 'CONFIG', 'FINE', 'FINER', 'FINEST']
22
+
23
+ attr_accessor :min_memory, :max_memory, :bind_address, :port, :solr_data_dir, :solr_home, :log_file
24
+ attr_writer :pid_dir, :pid_file, :log_level, :solr_data_dir, :solr_home, :solr_jar
25
+
26
+ def initialize(*args)
27
+ ensure_java_installed
28
+ super(*args)
29
+ end
30
+
31
+ #
32
+ # Bootstrap a new solr_home by creating all required
33
+ # directories.
34
+ #
35
+ # ==== Returns
36
+ #
37
+ # Boolean:: success
38
+ #
39
+ def bootstrap
40
+ unless @bootstrapped
41
+ install_solr_home
42
+ create_solr_directories
43
+ @bootstrapped = true
44
+ end
45
+ end
46
+
47
+ #
48
+ # Start the sunspot-solr server. Bootstrap solr_home first,
49
+ # if neccessary.
50
+ #
51
+ # ==== Returns
52
+ #
53
+ # Boolean:: success
54
+ #
55
+ def start
56
+ bootstrap
57
+
58
+ if File.exist?(pid_path)
59
+ existing_pid = IO.read(pid_path).to_i
60
+ begin
61
+ Process.kill(0, existing_pid)
62
+ raise(AlreadyRunningError, "Server is already running with PID #{existing_pid}")
63
+ rescue Errno::ESRCH
64
+ STDERR.puts("Removing stale PID file at #{pid_path}")
65
+ FileUtils.rm(pid_path)
66
+ end
67
+ end
68
+ fork do
69
+ pid = fork do
70
+ Process.setsid
71
+ STDIN.reopen('/dev/null')
72
+ STDOUT.reopen('/dev/null', 'a')
73
+ STDERR.reopen(STDOUT)
74
+ run
75
+ end
76
+ FileUtils.mkdir_p(pid_dir)
77
+ File.open(pid_path, 'w') do |file|
78
+ file << pid
79
+ end
80
+ end
81
+ end
82
+
83
+ #
84
+ # Run the sunspot-solr server in the foreground. Boostrap
85
+ # solr_home first, if neccessary.
86
+ #
87
+ # ==== Returns
88
+ #
89
+ # Boolean:: success
90
+ #
91
+ def run
92
+ bootstrap
93
+
94
+ command = ['java']
95
+ command << "-Xms#{min_memory}" if min_memory
96
+ command << "-Xmx#{max_memory}" if max_memory
97
+ command << "-Djetty.port=#{port}" if port
98
+ command << "-Djetty.host=#{bind_address}" if bind_address
99
+ command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir
100
+ command << "-Dsolr.solr.home=#{solr_home}" if solr_home
101
+ command << "-Djava.util.logging.config.file=#{logging_config_path}" if logging_config_path
102
+ command << '-jar' << File.basename(solr_jar)
103
+ FileUtils.cd(File.dirname(solr_jar)) do
104
+ exec(Escape.shell_command(command))
105
+ end
106
+ end
107
+
108
+ #
109
+ # Stop the sunspot-solr server.
110
+ #
111
+ # ==== Returns
112
+ #
113
+ # Boolean:: success
114
+ #
115
+ def stop
116
+ if File.exist?(pid_path)
117
+ pid = IO.read(pid_path).to_i
118
+ begin
119
+ Process.kill('TERM', pid)
120
+ rescue Errno::ESRCH
121
+ raise NotRunningError, "Process with PID #{pid} is no longer running"
122
+ ensure
123
+ FileUtils.rm(pid_path)
124
+ end
125
+ else
126
+ raise NotRunningError, "No PID file at #{pid_path}"
127
+ end
128
+ end
129
+
130
+ def log_level=(level)
131
+ unless LOG_LEVELS.include?(level.to_s.upcase)
132
+ raise(ArgumentError, "#{level} is not a valid log level: Use one of #{LOG_LEVELS.to_a.join(',')}")
133
+ end
134
+ @log_level = level.to_s.upcase
135
+ end
136
+
137
+ def log_level
138
+ @log_level || 'WARNING'
139
+ end
140
+
141
+ def pid_path
142
+ File.join(pid_dir, pid_file)
143
+ end
144
+
145
+ def pid_file
146
+ @pid_file || 'sunspot-solr.pid'
147
+ end
148
+
149
+ def pid_dir
150
+ File.expand_path(@pid_dir || FileUtils.pwd)
151
+ end
152
+
153
+ def solr_data_dir
154
+ File.expand_path(@solr_data_dir || Dir.tmpdir)
155
+ end
156
+
157
+ def solr_home
158
+ File.expand_path(@solr_home || File.join(File.dirname(solr_jar), 'solr'))
159
+ end
160
+
161
+ def solr_jar
162
+ @solr_jar || SOLR_START_JAR
163
+ end
164
+
165
+ #
166
+ # Copy default solr configuration files from sunspot
167
+ # gem to the new solr_home/config directory
168
+ #
169
+ # ==== Returns
170
+ #
171
+ # Boolean:: success
172
+ #
173
+ def install_solr_home
174
+ unless File.exists?(solr_home)
175
+ Sunspot::Solr::Installer.execute(
176
+ solr_home,
177
+ :force => true,
178
+ :verbose => true
179
+ )
180
+ end
181
+ end
182
+
183
+ #
184
+ # Create new solr_home, config, log and pid directories
185
+ #
186
+ # ==== Returns
187
+ #
188
+ # Boolean:: success
189
+ #
190
+ def create_solr_directories
191
+ [solr_data_dir, pid_dir].each do |path|
192
+ FileUtils.mkdir_p(path) unless File.exists?(path)
193
+ end
194
+ end
195
+
196
+ private
197
+
198
+ def ensure_java_installed
199
+ unless defined?(@java_installed)
200
+ @java_installed = Sunspot::Solr::Java.installed?
201
+ unless @java_installed
202
+ raise JavaMissing.new("You need a Java Runtime Environment to run the Solr server")
203
+ end
204
+ end
205
+ @java_installed
206
+ end
207
+
208
+ def logging_config_path
209
+ return @logging_config_path if defined?(@logging_config_path)
210
+ @logging_config_path =
211
+ if log_file
212
+ logging_config = Tempfile.new('logging.properties')
213
+ logging_config.puts("handlers = java.util.logging.FileHandler")
214
+ logging_config.puts("java.util.logging.FileHandler.level = #{log_level.to_s.upcase}")
215
+ logging_config.puts("java.util.logging.FileHandler.pattern = #{log_file}")
216
+ logging_config.puts("java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter")
217
+ logging_config.flush
218
+ logging_config.close
219
+ logging_config.path
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,49 @@
1
+ namespace :sunspot do
2
+ namespace :solr do
3
+ desc 'Start the Solr instance'
4
+ task :start => :environment do
5
+ case RUBY_PLATFORM
6
+ when /w(in)?32$/, /java$/
7
+ abort("This command is not supported on #{RUBY_PLATFORM}. " +
8
+ "Use rake sunspot:solr:run to run Solr in the foreground.")
9
+ end
10
+
11
+ if defined?(Sunspot::Rails::Server)
12
+ Sunspot::Rails::Server.new.start
13
+ else
14
+ Sunspot::Solr::Server.new.start
15
+ end
16
+
17
+ puts "Successfully started Solr ..."
18
+ end
19
+
20
+ desc 'Run the Solr instance in the foreground'
21
+ task :run => :environment do
22
+ if defined?(Sunspot::Rails::Server)
23
+ Sunspot::Rails::Server.new.run
24
+ else
25
+ Sunspot::Solr::Server.new.run
26
+ end
27
+ end
28
+
29
+ desc 'Stop the Solr instance'
30
+ task :stop => :environment do
31
+ case RUBY_PLATFORM
32
+ when /w(in)?32$/, /java$/
33
+ abort("This command is not supported on #{RUBY_PLATFORM}. " +
34
+ "Use rake sunspot:solr:run to run Solr in the foreground.")
35
+ end
36
+
37
+ if defined?(Sunspot::Rails::Server)
38
+ Sunspot::Rails::Server.new.stop
39
+ else
40
+ Sunspot::Solr::Server.new.stop
41
+ end
42
+
43
+ puts "Successfully stopped Solr ..."
44
+ end
45
+
46
+ # for backwards compatibility
47
+ task :reindex => :"sunspot:reindex"
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ require 'sunspot/solr/server'
2
+
3
+ if defined?(Rails) && Rails::VERSION::MAJOR == 3
4
+ require 'sunspot/solr/railtie'
5
+ end
data/solr/README.txt ADDED
@@ -0,0 +1,42 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright ownership.
4
+ # The ASF licenses this file to You under the Apache License, Version 2.0
5
+ # (the "License"); you may not use this file except in compliance with
6
+ # the License. You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ Solr example configuration
17
+ --------------------------
18
+
19
+ To run this example configuration, use
20
+
21
+ java -jar start.jar
22
+
23
+ in this directory, and when Solr is started connect to
24
+
25
+ http://localhost:8983/solr/admin/
26
+
27
+ To add documents to the index, use the post.sh script in the exampledocs
28
+ subdirectory (while Solr is running), for example:
29
+
30
+ cd exampledocs
31
+ ./post.sh *.xml
32
+
33
+ See also README.txt in the solr subdirectory, and check
34
+ http://wiki.apache.org/solr/SolrResources for a list of tutorials and
35
+ introductory articles.
36
+
37
+ NOTE: This Solr example server references SolrCell jars outside of the server
38
+ directory with <lib> statements in the solrconfig.xml. If you make a copy of
39
+ this example server and wish to use the ExtractingRequestHandler (SolrCell),
40
+ you will need to copy the required jars into solr/lib or update the paths to
41
+ the jars in your solrconfig.xml.
42
+