qiny_sunspot_solr 2.1.0

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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/README.rdoc +24 -0
  4. data/bin/sunspot-installer +20 -0
  5. data/bin/sunspot-solr +80 -0
  6. data/lib/sunspot/solr/installer.rb +25 -0
  7. data/lib/sunspot/solr/installer/config_installer.rb +62 -0
  8. data/lib/sunspot/solr/installer/task_helper.rb +13 -0
  9. data/lib/sunspot/solr/java.rb +13 -0
  10. data/lib/sunspot/solr/railtie.rb +15 -0
  11. data/lib/sunspot/solr/server.rb +224 -0
  12. data/lib/sunspot/solr/tasks.rb +49 -0
  13. data/lib/sunspot_solr.rb +5 -0
  14. data/solr/README.txt +42 -0
  15. data/solr/contexts/solr.xml +8 -0
  16. data/solr/etc/jetty.xml +167 -0
  17. data/solr/etc/webdefault.xml +527 -0
  18. data/solr/lib/ext/jcl-over-slf4j-1.6.6.jar +0 -0
  19. data/solr/lib/ext/jul-to-slf4j-1.6.6.jar +0 -0
  20. data/solr/lib/ext/log4j-1.2.16.jar +0 -0
  21. data/solr/lib/ext/log4j.properties +19 -0
  22. data/solr/lib/ext/slf4j-api-1.6.6.jar +0 -0
  23. data/solr/lib/ext/slf4j-log4j12-1.6.6.jar +0 -0
  24. data/solr/lib/jetty-continuation-8.1.8.v20121106.jar +0 -0
  25. data/solr/lib/jetty-deploy-8.1.8.v20121106.jar +0 -0
  26. data/solr/lib/jetty-http-8.1.8.v20121106.jar +0 -0
  27. data/solr/lib/jetty-io-8.1.8.v20121106.jar +0 -0
  28. data/solr/lib/jetty-jmx-8.1.8.v20121106.jar +0 -0
  29. data/solr/lib/jetty-security-8.1.8.v20121106.jar +0 -0
  30. data/solr/lib/jetty-server-8.1.8.v20121106.jar +0 -0
  31. data/solr/lib/jetty-servlet-8.1.8.v20121106.jar +0 -0
  32. data/solr/lib/jetty-util-8.1.8.v20121106.jar +0 -0
  33. data/solr/lib/jetty-webapp-8.1.8.v20121106.jar +0 -0
  34. data/solr/lib/jetty-xml-8.1.8.v20121106.jar +0 -0
  35. data/solr/lib/jsp-2.1/ant-1.6.5.jar +0 -0
  36. data/solr/lib/jsp-2.1/core-3.1.1.jar +0 -0
  37. data/solr/lib/jsp-2.1/jsp-2.1.jar +0 -0
  38. data/solr/lib/jsp-2.1/jsp-api-2.1.jar +0 -0
  39. data/solr/lib/servlet-api-3.0.jar +0 -0
  40. data/solr/solr/.gitignore +1 -0
  41. data/solr/solr/conf/admin-extra.html +31 -0
  42. data/solr/solr/conf/elevate.xml +36 -0
  43. data/solr/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  44. data/solr/solr/conf/protwords.txt +21 -0
  45. data/solr/solr/conf/schema.xml +262 -0
  46. data/solr/solr/conf/scripts.conf +24 -0
  47. data/solr/solr/conf/solrconfig.xml +667 -0
  48. data/solr/solr/conf/spellings.txt +2 -0
  49. data/solr/solr/conf/stopwords.txt +58 -0
  50. data/solr/solr/conf/synonyms.txt +31 -0
  51. data/solr/solr/conf/xslt/example.xsl +132 -0
  52. data/solr/solr/conf/xslt/example_atom.xsl +67 -0
  53. data/solr/solr/conf/xslt/example_rss.xsl +66 -0
  54. data/solr/solr/conf/xslt/luke.xsl +337 -0
  55. data/solr/solr/default/README.txt +54 -0
  56. data/solr/solr/dic/words.dic +149853 -0
  57. data/solr/solr/solr.xml +8 -0
  58. data/solr/start.jar +0 -0
  59. data/solr/webapps/solr.war +0 -0
  60. data/spec/server_spec.rb +98 -0
  61. data/spec/spec_helper.rb +18 -0
  62. data/sunspot_solr.gemspec +40 -0
  63. metadata +165 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4bef6f55fbfe344491f5ff1c2f2bed810965506903456f36325c06881689c6f9
4
+ data.tar.gz: d15f237cc42055dbbb1f81362d7ffe79182cdbca909c06dc895510c6c0c30c16
5
+ SHA512:
6
+ metadata.gz: 269901288b8946375ed350c12fd30afef94280a06afa8530ec5500c55871f913ffedf875318c6e3b9891f2503e51512a4dc6323ab68d6835c098825f338aca2a
7
+ data.tar.gz: 4e0f4e1a4838081723541bbf090ddddca9f0f0391125f56e6c1fb58c673ff1fa355227728ec86ecf1903badca433c65604966e57c540dd1a82c4521cef117355
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] [-b ip4_address] [-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,62 @@
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
+
43
+ # Also copy the solr.xml file for multi core support
44
+ file = File.expand_path('../solr.xml', sunspot_config_path)
45
+ dest = File.expand_path(File.join(@config_path, ".."), File.basename(file))
46
+ say("Copying #{file} => #{dest}")
47
+ FileUtils.cp(file, dest)
48
+
49
+ # Also copy words.dic file for mmseg4j
50
+ FileUtils.mkdir_p(File.join(@config_path, '../dic'))
51
+ dest = File.expand_path(File.join(@config_path, '../dic/words.dic'))
52
+ unless File.exist?(dest)
53
+ file = File.expand_path(File.join(sunspot_config_path, '../dic/words.dic'))
54
+ say("Copying #{file} => #{dest}")
55
+ FileUtils.cp(file, dest)
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+ end
62
+ 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,13 @@
1
+ require 'rbconfig'
2
+
3
+ module Sunspot
4
+ module Solr
5
+ module Java
6
+ NULL_DEVICE = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ? 'NUL' : '/dev/null'
7
+
8
+ def self.installed?
9
+ system "java -version >#{NULL_DEVICE} 2>&1"
10
+ end
11
+ end
12
+ end
13
+ 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 '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, :log_file
23
+
24
+ attr_writer :pid_dir, :pid_file, :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')
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(*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