culturecode-sunspot_solr 2.0.0.pre
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/Gemfile +3 -0
- data/README.rdoc +24 -0
- data/bin/sunspot-installer +20 -0
- data/bin/sunspot-solr +80 -0
- data/lib/sunspot/solr/installer.rb +25 -0
- data/lib/sunspot/solr/installer/config_installer.rb +46 -0
- data/lib/sunspot/solr/installer/task_helper.rb +13 -0
- data/lib/sunspot/solr/java.rb +10 -0
- data/lib/sunspot/solr/railtie.rb +15 -0
- data/lib/sunspot/solr/server.rb +223 -0
- data/lib/sunspot/solr/tasks.rb +49 -0
- data/lib/sunspot_solr.rb +5 -0
- data/solr/README.txt +42 -0
- data/solr/etc/jetty.xml +219 -0
- data/solr/etc/webdefault.xml +379 -0
- data/solr/lib/jetty-6.1.26-patched-JETTY-1340.jar +0 -0
- data/solr/lib/jetty-util-6.1.26-patched-JETTY-1340.jar +0 -0
- data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
- data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
- data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
- data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
- data/solr/lib/servlet-api-2.5-20081211.jar +0 -0
- data/solr/solr/.gitignore +1 -0
- data/solr/solr/README.txt +54 -0
- data/solr/solr/conf/admin-extra.html +31 -0
- data/solr/solr/conf/elevate.xml +36 -0
- data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
- data/solr/solr/conf/protwords.txt +21 -0
- data/solr/solr/conf/schema.xml +250 -0
- data/solr/solr/conf/scripts.conf +24 -0
- data/solr/solr/conf/solrconfig.xml +934 -0
- data/solr/solr/conf/spellings.txt +2 -0
- data/solr/solr/conf/stopwords.txt +58 -0
- data/solr/solr/conf/synonyms.txt +31 -0
- data/solr/solr/conf/xslt/example.xsl +132 -0
- data/solr/solr/conf/xslt/example_atom.xsl +67 -0
- data/solr/solr/conf/xslt/example_rss.xsl +66 -0
- data/solr/solr/conf/xslt/luke.xsl +337 -0
- data/solr/start.jar +0 -0
- data/solr/webapps/solr.war +0 -0
- data/spec/server_spec.rb +98 -0
- data/spec/spec_helper.rb +18 -0
- data/sunspot_solr.gemspec +37 -0
- metadata +139 -0
data/Gemfile
ADDED
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,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,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,223 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'sunspot/solr/java'
|
4
|
+
require 'sunspot/solr/installer'
|
5
|
+
|
6
|
+
module Sunspot
|
7
|
+
module Solr
|
8
|
+
class Server #:nodoc:
|
9
|
+
# Raised if #stop is called but the server is not running
|
10
|
+
ServerError = Class.new(RuntimeError)
|
11
|
+
AlreadyRunningError = Class.new(ServerError)
|
12
|
+
NotRunningError = Class.new(ServerError)
|
13
|
+
JavaMissing = Class.new(ServerError)
|
14
|
+
|
15
|
+
# Name of the sunspot executable (shell script)
|
16
|
+
SOLR_START_JAR = File.expand_path(
|
17
|
+
File.join(File.dirname(__FILE__), '..', '..', '..', 'solr', 'start.jar')
|
18
|
+
)
|
19
|
+
|
20
|
+
LOG_LEVELS = Set['SEVERE', 'WARNING', 'INFO', 'CONFIG', 'FINE', 'FINER', 'FINEST']
|
21
|
+
|
22
|
+
attr_accessor :min_memory, :max_memory, :bind_address, :port, :solr_data_dir, :solr_home, :log_file
|
23
|
+
attr_writer :pid_dir, :pid_file, :log_level, :solr_data_dir, :solr_home, :solr_jar
|
24
|
+
|
25
|
+
def initialize(*args)
|
26
|
+
ensure_java_installed
|
27
|
+
super(*args)
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Bootstrap a new solr_home by creating all required
|
32
|
+
# directories.
|
33
|
+
#
|
34
|
+
# ==== Returns
|
35
|
+
#
|
36
|
+
# Boolean:: success
|
37
|
+
#
|
38
|
+
def bootstrap
|
39
|
+
unless @bootstrapped
|
40
|
+
install_solr_home
|
41
|
+
create_solr_directories
|
42
|
+
@bootstrapped = true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Start the sunspot-solr server. Bootstrap solr_home first,
|
48
|
+
# if neccessary.
|
49
|
+
#
|
50
|
+
# ==== Returns
|
51
|
+
#
|
52
|
+
# Boolean:: success
|
53
|
+
#
|
54
|
+
def start
|
55
|
+
bootstrap
|
56
|
+
|
57
|
+
if File.exist?(pid_path)
|
58
|
+
existing_pid = IO.read(pid_path).to_i
|
59
|
+
begin
|
60
|
+
Process.kill(0, existing_pid)
|
61
|
+
raise(AlreadyRunningError, "Server is already running with PID #{existing_pid}")
|
62
|
+
rescue Errno::ESRCH
|
63
|
+
STDERR.puts("Removing stale PID file at #{pid_path}")
|
64
|
+
FileUtils.rm(pid_path)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
fork do
|
68
|
+
pid = fork do
|
69
|
+
Process.setsid
|
70
|
+
STDIN.reopen('/dev/null')
|
71
|
+
STDOUT.reopen('/dev/null', 'a')
|
72
|
+
STDERR.reopen(STDOUT)
|
73
|
+
run
|
74
|
+
end
|
75
|
+
FileUtils.mkdir_p(pid_dir)
|
76
|
+
File.open(pid_path, 'w') do |file|
|
77
|
+
file << pid
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Run the sunspot-solr server in the foreground. Boostrap
|
84
|
+
# solr_home first, if neccessary.
|
85
|
+
#
|
86
|
+
# ==== Returns
|
87
|
+
#
|
88
|
+
# Boolean:: success
|
89
|
+
#
|
90
|
+
def run
|
91
|
+
bootstrap
|
92
|
+
|
93
|
+
command = ['java']
|
94
|
+
command << "-Xms#{min_memory}" if min_memory
|
95
|
+
command << "-Xmx#{max_memory}" if max_memory
|
96
|
+
command << "-Djetty.port=#{port}" if port
|
97
|
+
command << "-Djetty.host=#{bind_address}" if bind_address
|
98
|
+
command << "-Dsolr.data.dir=#{solr_data_dir}" if solr_data_dir
|
99
|
+
command << "-Dsolr.solr.home=#{solr_home}" if solr_home
|
100
|
+
command << "-Djava.util.logging.config.file=#{logging_config_path}" if logging_config_path
|
101
|
+
command << '-jar' << File.basename(solr_jar)
|
102
|
+
FileUtils.cd(File.dirname(solr_jar)) do
|
103
|
+
exec(*command)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
# Stop the sunspot-solr server.
|
109
|
+
#
|
110
|
+
# ==== Returns
|
111
|
+
#
|
112
|
+
# Boolean:: success
|
113
|
+
#
|
114
|
+
def stop
|
115
|
+
if File.exist?(pid_path)
|
116
|
+
pid = IO.read(pid_path).to_i
|
117
|
+
begin
|
118
|
+
Process.kill('TERM', pid)
|
119
|
+
rescue Errno::ESRCH
|
120
|
+
raise NotRunningError, "Process with PID #{pid} is no longer running"
|
121
|
+
ensure
|
122
|
+
FileUtils.rm(pid_path)
|
123
|
+
end
|
124
|
+
else
|
125
|
+
raise NotRunningError, "No PID file at #{pid_path}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def log_level=(level)
|
130
|
+
unless LOG_LEVELS.include?(level.to_s.upcase)
|
131
|
+
raise(ArgumentError, "#{level} is not a valid log level: Use one of #{LOG_LEVELS.to_a.join(',')}")
|
132
|
+
end
|
133
|
+
@log_level = level.to_s.upcase
|
134
|
+
end
|
135
|
+
|
136
|
+
def log_level
|
137
|
+
@log_level || 'WARNING'
|
138
|
+
end
|
139
|
+
|
140
|
+
def pid_path
|
141
|
+
File.join(pid_dir, pid_file)
|
142
|
+
end
|
143
|
+
|
144
|
+
def pid_file
|
145
|
+
@pid_file || 'sunspot-solr.pid'
|
146
|
+
end
|
147
|
+
|
148
|
+
def pid_dir
|
149
|
+
File.expand_path(@pid_dir || FileUtils.pwd)
|
150
|
+
end
|
151
|
+
|
152
|
+
def solr_data_dir
|
153
|
+
File.expand_path(@solr_data_dir || Dir.tmpdir)
|
154
|
+
end
|
155
|
+
|
156
|
+
def solr_home
|
157
|
+
File.expand_path(@solr_home || File.join(File.dirname(solr_jar), 'solr'))
|
158
|
+
end
|
159
|
+
|
160
|
+
def solr_jar
|
161
|
+
@solr_jar || SOLR_START_JAR
|
162
|
+
end
|
163
|
+
|
164
|
+
#
|
165
|
+
# Copy default solr configuration files from sunspot
|
166
|
+
# gem to the new solr_home/config directory
|
167
|
+
#
|
168
|
+
# ==== Returns
|
169
|
+
#
|
170
|
+
# Boolean:: success
|
171
|
+
#
|
172
|
+
def install_solr_home
|
173
|
+
unless File.exists?(solr_home)
|
174
|
+
Sunspot::Solr::Installer.execute(
|
175
|
+
solr_home,
|
176
|
+
:force => true,
|
177
|
+
:verbose => true
|
178
|
+
)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
#
|
183
|
+
# Create new solr_home, config, log and pid directories
|
184
|
+
#
|
185
|
+
# ==== Returns
|
186
|
+
#
|
187
|
+
# Boolean:: success
|
188
|
+
#
|
189
|
+
def create_solr_directories
|
190
|
+
[solr_data_dir, pid_dir].each do |path|
|
191
|
+
FileUtils.mkdir_p(path) unless File.exists?(path)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
private
|
196
|
+
|
197
|
+
def ensure_java_installed
|
198
|
+
unless defined?(@java_installed)
|
199
|
+
@java_installed = Sunspot::Solr::Java.installed?
|
200
|
+
unless @java_installed
|
201
|
+
raise JavaMissing.new("You need a Java Runtime Environment to run the Solr server")
|
202
|
+
end
|
203
|
+
end
|
204
|
+
@java_installed
|
205
|
+
end
|
206
|
+
|
207
|
+
def logging_config_path
|
208
|
+
return @logging_config_path if defined?(@logging_config_path)
|
209
|
+
@logging_config_path =
|
210
|
+
if log_file
|
211
|
+
logging_config = Tempfile.new('logging.properties')
|
212
|
+
logging_config.puts("handlers = java.util.logging.FileHandler")
|
213
|
+
logging_config.puts("java.util.logging.FileHandler.level = #{log_level.to_s.upcase}")
|
214
|
+
logging_config.puts("java.util.logging.FileHandler.pattern = #{log_file}")
|
215
|
+
logging_config.puts("java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter")
|
216
|
+
logging_config.flush
|
217
|
+
logging_config.close
|
218
|
+
logging_config.path
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|