rere 0.0.1
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/.classpath +260 -0
- data/.gitignore +28 -0
- data/.project +14 -0
- data/.ruby-version +1 -0
- data/.settings/org.eclim.prefs +3 -0
- data/.settings/org.eclipse.jdt.core.prefs +5 -0
- data/.settings/org.eclipse.jdt.ui.prefs +2 -0
- data/Gemfile +7 -0
- data/LICENSE +22 -0
- data/README.md +44 -0
- data/Rakefile +65 -0
- data/bin/solr +61 -0
- data/example/config/solr.yml +23 -0
- data/example/log/.gitkeep +0 -0
- data/example/solr/README.txt +63 -0
- data/example/solr/collection1/README.txt +50 -0
- data/example/solr/collection1/conf/admin-extra.html +24 -0
- data/example/solr/collection1/conf/admin-extra.menu-bottom.html +25 -0
- data/example/solr/collection1/conf/admin-extra.menu-top.html +25 -0
- data/example/solr/collection1/conf/currency.xml +67 -0
- data/example/solr/collection1/conf/elevate.xml +38 -0
- data/example/solr/collection1/conf/lang/contractions_ca.txt +8 -0
- data/example/solr/collection1/conf/lang/contractions_fr.txt +15 -0
- data/example/solr/collection1/conf/lang/contractions_ga.txt +5 -0
- data/example/solr/collection1/conf/lang/contractions_it.txt +23 -0
- data/example/solr/collection1/conf/lang/hyphenations_ga.txt +5 -0
- data/example/solr/collection1/conf/lang/stemdict_nl.txt +6 -0
- data/example/solr/collection1/conf/lang/stoptags_ja.txt +420 -0
- data/example/solr/collection1/conf/lang/stopwords_ar.txt +125 -0
- data/example/solr/collection1/conf/lang/stopwords_bg.txt +193 -0
- data/example/solr/collection1/conf/lang/stopwords_ca.txt +220 -0
- data/example/solr/collection1/conf/lang/stopwords_cz.txt +172 -0
- data/example/solr/collection1/conf/lang/stopwords_da.txt +108 -0
- data/example/solr/collection1/conf/lang/stopwords_de.txt +292 -0
- data/example/solr/collection1/conf/lang/stopwords_el.txt +78 -0
- data/example/solr/collection1/conf/lang/stopwords_en.txt +54 -0
- data/example/solr/collection1/conf/lang/stopwords_es.txt +354 -0
- data/example/solr/collection1/conf/lang/stopwords_eu.txt +99 -0
- data/example/solr/collection1/conf/lang/stopwords_fa.txt +313 -0
- data/example/solr/collection1/conf/lang/stopwords_fi.txt +95 -0
- data/example/solr/collection1/conf/lang/stopwords_fr.txt +184 -0
- data/example/solr/collection1/conf/lang/stopwords_ga.txt +110 -0
- data/example/solr/collection1/conf/lang/stopwords_gl.txt +161 -0
- data/example/solr/collection1/conf/lang/stopwords_hi.txt +235 -0
- data/example/solr/collection1/conf/lang/stopwords_hu.txt +209 -0
- data/example/solr/collection1/conf/lang/stopwords_hy.txt +46 -0
- data/example/solr/collection1/conf/lang/stopwords_id.txt +359 -0
- data/example/solr/collection1/conf/lang/stopwords_it.txt +301 -0
- data/example/solr/collection1/conf/lang/stopwords_ja.txt +127 -0
- data/example/solr/collection1/conf/lang/stopwords_lv.txt +172 -0
- data/example/solr/collection1/conf/lang/stopwords_nl.txt +117 -0
- data/example/solr/collection1/conf/lang/stopwords_no.txt +192 -0
- data/example/solr/collection1/conf/lang/stopwords_pt.txt +251 -0
- data/example/solr/collection1/conf/lang/stopwords_ro.txt +233 -0
- data/example/solr/collection1/conf/lang/stopwords_ru.txt +241 -0
- data/example/solr/collection1/conf/lang/stopwords_sv.txt +131 -0
- data/example/solr/collection1/conf/lang/stopwords_th.txt +119 -0
- data/example/solr/collection1/conf/lang/stopwords_tr.txt +212 -0
- data/example/solr/collection1/conf/lang/userdict_ja.txt +29 -0
- data/example/solr/collection1/conf/mapping-FoldToASCII.txt +3813 -0
- data/example/solr/collection1/conf/mapping-ISOLatin1Accent.txt +246 -0
- data/example/solr/collection1/conf/protwords.txt +21 -0
- data/example/solr/collection1/conf/schema.xml +1125 -0
- data/example/solr/collection1/conf/scripts.conf +24 -0
- data/example/solr/collection1/conf/solrconfig.xml +1816 -0
- data/example/solr/collection1/conf/spellings.txt +2 -0
- data/example/solr/collection1/conf/stopwords.txt +14 -0
- data/example/solr/collection1/conf/synonyms.txt +29 -0
- data/example/solr/collection1/conf/update-script.js +53 -0
- data/example/solr/collection1/conf/velocity/VM_global_library.vm +170 -0
- data/example/solr/collection1/conf/velocity/browse.vm +50 -0
- data/example/solr/collection1/conf/velocity/cluster.vm +9 -0
- data/example/solr/collection1/conf/velocity/clusterResults.vm +12 -0
- data/example/solr/collection1/conf/velocity/debug.vm +17 -0
- data/example/solr/collection1/conf/velocity/did_you_mean.vm +4 -0
- data/example/solr/collection1/conf/velocity/facet_fields.vm +15 -0
- data/example/solr/collection1/conf/velocity/facet_pivot.vm +3 -0
- data/example/solr/collection1/conf/velocity/facet_queries.vm +3 -0
- data/example/solr/collection1/conf/velocity/facet_ranges.vm +15 -0
- data/example/solr/collection1/conf/velocity/facets.vm +5 -0
- data/example/solr/collection1/conf/velocity/footer.vm +17 -0
- data/example/solr/collection1/conf/velocity/head.vm +32 -0
- data/example/solr/collection1/conf/velocity/header.vm +3 -0
- data/example/solr/collection1/conf/velocity/hit.vm +11 -0
- data/example/solr/collection1/conf/velocity/hitGrouped.vm +24 -0
- data/example/solr/collection1/conf/velocity/join-doc.vm +4 -0
- data/example/solr/collection1/conf/velocity/jquery.autocomplete.css +48 -0
- data/example/solr/collection1/conf/velocity/jquery.autocomplete.js +763 -0
- data/example/solr/collection1/conf/velocity/layout.vm +20 -0
- data/example/solr/collection1/conf/velocity/main.css +208 -0
- data/example/solr/collection1/conf/velocity/product-doc.vm +27 -0
- data/example/solr/collection1/conf/velocity/query.vm +42 -0
- data/example/solr/collection1/conf/velocity/queryGroup.vm +19 -0
- data/example/solr/collection1/conf/velocity/querySpatial.vm +40 -0
- data/example/solr/collection1/conf/velocity/richtext-doc.vm +114 -0
- data/example/solr/collection1/conf/velocity/suggest.vm +3 -0
- data/example/solr/collection1/conf/velocity/tabs.vm +6 -0
- data/example/solr/collection1/conf/xslt/example.xsl +132 -0
- data/example/solr/collection1/conf/xslt/example_atom.xsl +67 -0
- data/example/solr/collection1/conf/xslt/example_rss.xsl +66 -0
- data/example/solr/collection1/conf/xslt/luke.xsl +337 -0
- data/example/solr/collection1/conf/xslt/updateXml.xsl +70 -0
- data/example/solr/collection1/data/index/segments.gen +0 -0
- data/example/solr/collection1/data/index/segments_1 +0 -0
- data/example/solr/data/development/index/segments.gen +0 -0
- data/example/solr/data/development/index/segments_1 +0 -0
- data/example/solr/solr.xml +53 -0
- data/example/solr/zoo.cfg +17 -0
- data/lib/rere.rb +66 -0
- data/lib/rere/railtie.rb +8 -0
- data/lib/rere/server.rb +380 -0
- data/lib/rere/tasks/solr.rake +47 -0
- data/lib/rere/version.rb +3 -0
- data/pom.xml +168 -0
- data/rere.gemspec +26 -0
- data/server/README.txt +78 -0
- data/server/cloud-scripts/zkcli.bat +12 -0
- data/server/cloud-scripts/zkcli.sh +14 -0
- data/server/contexts/solr-jetty-context.xml +8 -0
- data/server/etc/create-solrtest.keystore.sh +37 -0
- data/server/etc/jetty.xml +205 -0
- data/server/etc/logging.properties +38 -0
- data/server/etc/solrtest.keystore +0 -0
- data/server/etc/webdefault.xml +527 -0
- data/server/exampledocs/books.csv +11 -0
- data/server/exampledocs/books.json +51 -0
- data/server/exampledocs/gb18030-example.xml +32 -0
- data/server/exampledocs/hd.xml +56 -0
- data/server/exampledocs/ipod_other.xml +60 -0
- data/server/exampledocs/ipod_video.xml +40 -0
- data/server/exampledocs/manufacturers.xml +75 -0
- data/server/exampledocs/mem.xml +77 -0
- data/server/exampledocs/money.xml +65 -0
- data/server/exampledocs/monitor.xml +35 -0
- data/server/exampledocs/monitor2.xml +34 -0
- data/server/exampledocs/mp500.xml +43 -0
- data/server/exampledocs/post.jar +0 -0
- data/server/exampledocs/post.sh +30 -0
- data/server/exampledocs/sd500.xml +38 -0
- data/server/exampledocs/solr.xml +38 -0
- data/server/exampledocs/test_utf8.sh +93 -0
- data/server/exampledocs/utf8-example.xml +42 -0
- data/server/exampledocs/vidcard.xml +62 -0
- data/server/lib/ext/jcl-over-slf4j-1.6.6.jar +0 -0
- data/server/lib/ext/jul-to-slf4j-1.6.6.jar +0 -0
- data/server/lib/ext/log4j-1.2.16.jar +0 -0
- data/server/lib/ext/slf4j-api-1.6.6.jar +0 -0
- data/server/lib/ext/slf4j-log4j12-1.6.6.jar +0 -0
- data/server/lib/jetty-continuation-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-deploy-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-http-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-io-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-jmx-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-security-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-server-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-servlet-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-util-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-webapp-8.1.8.v20121106.jar +0 -0
- data/server/lib/jetty-xml-8.1.8.v20121106.jar +0 -0
- data/server/lib/servlet-api-3.0.jar +0 -0
- data/server/resources/log4j.properties +19 -0
- data/server/solr/README.txt +63 -0
- data/server/solr/solr.xml +53 -0
- data/server/solr/zoo.cfg +17 -0
- data/server/start.jar +0 -0
- data/server/webapps/solr.war +0 -0
- data/solr/lib/solr-winds-0.1.jar +0 -0
- metadata +284 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
3
|
+
* contributor license agreements. See the NOTICE file distributed with
|
|
4
|
+
* this work for additional information regarding copyright ownership.
|
|
5
|
+
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
6
|
+
* (the "License"); you may not use this file except in compliance with
|
|
7
|
+
* the License. You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
-->
|
|
17
|
+
|
|
18
|
+
<!--
|
|
19
|
+
Simple transform of Solr query response into Solr Update XML compliant XML.
|
|
20
|
+
When used in the xslt response writer you will get UpdaateXML as output.
|
|
21
|
+
But you can also store a query response XML to disk and feed this XML to
|
|
22
|
+
the XSLTUpdateRequestHandler to index the content. Provided as example only.
|
|
23
|
+
See http://wiki.apache.org/solr/XsltUpdateRequestHandler for more info
|
|
24
|
+
-->
|
|
25
|
+
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
|
|
26
|
+
<xsl:output media-type="text/xml" method="xml" indent="yes"/>
|
|
27
|
+
|
|
28
|
+
<xsl:template match='/'>
|
|
29
|
+
<add>
|
|
30
|
+
<xsl:apply-templates select="response/result/doc"/>
|
|
31
|
+
</add>
|
|
32
|
+
</xsl:template>
|
|
33
|
+
|
|
34
|
+
<!-- Ignore score (makes no sense to index) -->
|
|
35
|
+
<xsl:template match="doc/*[@name='score']" priority="100">
|
|
36
|
+
</xsl:template>
|
|
37
|
+
|
|
38
|
+
<xsl:template match="doc">
|
|
39
|
+
<xsl:variable name="pos" select="position()"/>
|
|
40
|
+
<doc>
|
|
41
|
+
<xsl:apply-templates>
|
|
42
|
+
<xsl:with-param name="pos"><xsl:value-of select="$pos"/></xsl:with-param>
|
|
43
|
+
</xsl:apply-templates>
|
|
44
|
+
</doc>
|
|
45
|
+
</xsl:template>
|
|
46
|
+
|
|
47
|
+
<!-- Flatten arrays to duplicate field lines -->
|
|
48
|
+
<xsl:template match="doc/arr" priority="100">
|
|
49
|
+
<xsl:variable name="fn" select="@name"/>
|
|
50
|
+
|
|
51
|
+
<xsl:for-each select="*">
|
|
52
|
+
<xsl:element name="field">
|
|
53
|
+
<xsl:attribute name="name"><xsl:value-of select="$fn"/></xsl:attribute>
|
|
54
|
+
<xsl:value-of select="."/>
|
|
55
|
+
</xsl:element>
|
|
56
|
+
</xsl:for-each>
|
|
57
|
+
</xsl:template>
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
<xsl:template match="doc/*">
|
|
61
|
+
<xsl:variable name="fn" select="@name"/>
|
|
62
|
+
|
|
63
|
+
<xsl:element name="field">
|
|
64
|
+
<xsl:attribute name="name"><xsl:value-of select="$fn"/></xsl:attribute>
|
|
65
|
+
<xsl:value-of select="."/>
|
|
66
|
+
</xsl:element>
|
|
67
|
+
</xsl:template>
|
|
68
|
+
|
|
69
|
+
<xsl:template match="*"/>
|
|
70
|
+
</xsl:stylesheet>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
|
2
|
+
<!--
|
|
3
|
+
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
4
|
+
contributor license agreements. See the NOTICE file distributed with
|
|
5
|
+
this work for additional information regarding copyright ownership.
|
|
6
|
+
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
7
|
+
(the "License"); you may not use this file except in compliance with
|
|
8
|
+
the License. You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
-->
|
|
18
|
+
|
|
19
|
+
<!--
|
|
20
|
+
This is an example of a simple "solr.xml" file for configuring one or
|
|
21
|
+
more Solr Cores, as well as allowing Cores to be added, removed, and
|
|
22
|
+
reloaded via HTTP requests.
|
|
23
|
+
|
|
24
|
+
More information about options available in this configuration file,
|
|
25
|
+
and Solr Core administration can be found online:
|
|
26
|
+
http://wiki.apache.org/solr/CoreAdmin
|
|
27
|
+
-->
|
|
28
|
+
|
|
29
|
+
<!--
|
|
30
|
+
All (relative) paths are relative to the Solr Home Directory
|
|
31
|
+
|
|
32
|
+
persistent: Save changes made via the API to this file
|
|
33
|
+
sharedLib: path to a lib directory that will be shared across all cores
|
|
34
|
+
-->
|
|
35
|
+
<solr persistent="true">
|
|
36
|
+
<!-- by default, this is 50 @ WARN
|
|
37
|
+
<logging enabled="true">
|
|
38
|
+
<watcher size="100" threshold="INFO" />
|
|
39
|
+
</logging>
|
|
40
|
+
-->
|
|
41
|
+
|
|
42
|
+
<!--
|
|
43
|
+
adminPath: RequestHandler path to manage cores.
|
|
44
|
+
If 'null' (or absent), cores will not be manageable via request handler
|
|
45
|
+
defaultCoreName: (optional) core to use when no core name is specified in an access url
|
|
46
|
+
|
|
47
|
+
All of the attributes in cores after defaultCoreName only apply when running in SolrCloud mode.
|
|
48
|
+
You can read more about SolrCloud mode at http://wiki.apache.org/solr/SolrCloud
|
|
49
|
+
-->
|
|
50
|
+
<cores adminPath="/admin/cores" defaultCoreName="collection1" host="${host:}" hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}" zkClientTimeout="${zkClientTimeout:15000}">
|
|
51
|
+
<core name="collection1" instanceDir="collection1" />
|
|
52
|
+
</cores>
|
|
53
|
+
</solr>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# The number of milliseconds of each tick
|
|
2
|
+
tickTime=2000
|
|
3
|
+
# The number of ticks that the initial
|
|
4
|
+
# synchronization phase can take
|
|
5
|
+
initLimit=10
|
|
6
|
+
# The number of ticks that can pass between
|
|
7
|
+
# sending a request and getting an acknowledgement
|
|
8
|
+
syncLimit=5
|
|
9
|
+
|
|
10
|
+
# the directory where the snapshot is stored.
|
|
11
|
+
# dataDir=/opt/zookeeper/data
|
|
12
|
+
# NOTE: Solr defaults the dataDir to <solrHome>/zoo_data
|
|
13
|
+
|
|
14
|
+
# the port at which the clients will connect
|
|
15
|
+
# clientPort=2181
|
|
16
|
+
# NOTE: Solr sets this based on zkRun / zkHost params
|
|
17
|
+
|
data/lib/rere.rb
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'rere/version'
|
|
3
|
+
require 'rere/server'
|
|
4
|
+
|
|
5
|
+
if defined?(Rails)
|
|
6
|
+
require 'rere/railtie'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Rere
|
|
10
|
+
extend self
|
|
11
|
+
|
|
12
|
+
def start(timeout = 10)
|
|
13
|
+
server.start
|
|
14
|
+
|
|
15
|
+
# TODO: Maybe add this to the server.start method itself
|
|
16
|
+
wait_for_startup(timeout)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def run
|
|
20
|
+
server.run
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def stop
|
|
24
|
+
server.stop
|
|
25
|
+
puts "*** Stopped solr ***"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def reload_core(corename)
|
|
29
|
+
server.reload_core(corename)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def log_path
|
|
33
|
+
server.log_path
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def server
|
|
38
|
+
@server ||= begin
|
|
39
|
+
env = ENV['RAILS_ENV'] || 'development'
|
|
40
|
+
Rere::Server.new(:environment => env)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Hmmm, should I explicitly ping the cores too?
|
|
46
|
+
def running?
|
|
47
|
+
begin
|
|
48
|
+
ping_uri = URI.parse("#{server.url}/admin/ping")
|
|
49
|
+
Net::HTTP.get(ping_uri)
|
|
50
|
+
true
|
|
51
|
+
rescue
|
|
52
|
+
false
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def wait_for_startup(timeout)
|
|
59
|
+
timeout.times do
|
|
60
|
+
break if running?
|
|
61
|
+
sleep(1)
|
|
62
|
+
end
|
|
63
|
+
raise TimeoutError, "Solr didn't start within #{timeout}" unless running?
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
data/lib/rere/railtie.rb
ADDED
data/lib/rere/server.rb
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'tempfile'
|
|
3
|
+
require 'escape'
|
|
4
|
+
require 'uri'
|
|
5
|
+
require 'yaml'
|
|
6
|
+
require 'childprocess'
|
|
7
|
+
|
|
8
|
+
class Hash
|
|
9
|
+
def symbolize_keys!
|
|
10
|
+
keys.each do |key|
|
|
11
|
+
self[(key.to_sym rescue key) || key] = delete(key)
|
|
12
|
+
end
|
|
13
|
+
self
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Rere
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Wraps the basic operations for starting/stopping Solr in the Moto
|
|
21
|
+
# environment.
|
|
22
|
+
#
|
|
23
|
+
# By default when starting the server will look for a config/solr.yml
|
|
24
|
+
# file. If found these options will be used as the default options for
|
|
25
|
+
# solr. Any arguments provided on the command line will override those
|
|
26
|
+
# in the solr.yml file.
|
|
27
|
+
#
|
|
28
|
+
# = Configuration options
|
|
29
|
+
#
|
|
30
|
+
# <tt>environment</tt> - (required) the environment solr is starting in. The
|
|
31
|
+
# server will look up the config options under the given environment in
|
|
32
|
+
# config/solr.yml.
|
|
33
|
+
#
|
|
34
|
+
# <tt>config_path</tt> - use to specify a config file path for the server
|
|
35
|
+
# if it is not in the default location of config/solr.yml
|
|
36
|
+
#
|
|
37
|
+
class Server
|
|
38
|
+
|
|
39
|
+
ServerError = Class.new(RuntimeError)
|
|
40
|
+
ConfigError = Class.new(ServerError)
|
|
41
|
+
AlreadyRunningError = Class.new(ServerError)
|
|
42
|
+
NotRunningError = Class.new(ServerError)
|
|
43
|
+
JavaMissing = Class.new(ServerError)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# Jetty opts
|
|
47
|
+
attr_reader :server_root, :solr_home, :solr_data_dir, :tmp_dir, :port, :bind_address
|
|
48
|
+
|
|
49
|
+
# Java opts
|
|
50
|
+
attr_reader :min_memory, :max_memory, :log_level
|
|
51
|
+
|
|
52
|
+
# Environment opts
|
|
53
|
+
attr_reader :environment, :install_root, :config_path
|
|
54
|
+
|
|
55
|
+
# Solr opts
|
|
56
|
+
attr_reader :log_dir
|
|
57
|
+
|
|
58
|
+
# TODO: maybe explicitly read the options and check for anything that is
|
|
59
|
+
# not understood
|
|
60
|
+
def initialize(opts = {})
|
|
61
|
+
@environment = opts.delete(:environment) {|k| raise(ArgumentError, ":environment is required") }
|
|
62
|
+
@install_root = opts.fetch(:install_root) { File.join(Dir.pwd) }
|
|
63
|
+
|
|
64
|
+
# load the config for the server
|
|
65
|
+
@config_path = opts.delete(:config_file) {|k| "#{install_root}/config/solr.yml" }
|
|
66
|
+
unless File.exist?(@config_path)
|
|
67
|
+
raise ConfigError, "No configuration found. Looking for #{@config_path}"
|
|
68
|
+
end
|
|
69
|
+
puts "Loading config from #{@config_path} and environment #{@environment}"
|
|
70
|
+
|
|
71
|
+
config = YAML::load(File.open(@config_path))[@environment]['solr']
|
|
72
|
+
config.symbolize_keys!
|
|
73
|
+
|
|
74
|
+
config = config.merge(opts)
|
|
75
|
+
@min_memory = config.fetch(:min_memory) { 1024 }
|
|
76
|
+
@max_memory = config.fetch(:max_memory) { 1024 }
|
|
77
|
+
if config[:url]
|
|
78
|
+
@bind_address, @port = parse_url(config[:url])
|
|
79
|
+
else
|
|
80
|
+
@bind_address = config.delete(:hostname) {|k| raise(ArgumentError, ":hostname is required") }
|
|
81
|
+
@port = config[:port] || 8983
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
@log_level = config[:log_level] || 'INFO'
|
|
85
|
+
@log_dir = log_dir_path(config[:log_dir])
|
|
86
|
+
|
|
87
|
+
@solr_data_dir = config.delete(:data_dir) { "#{install_root}/solr/data/#{environment}" }
|
|
88
|
+
|
|
89
|
+
@solr_home = config.delete(:solr_home) { "#{install_root}/solr" }
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def log_dir_path(log_dir = nil)
|
|
94
|
+
if log_dir.nil?
|
|
95
|
+
"#{install_root}/log"
|
|
96
|
+
else
|
|
97
|
+
File.expand_path(log_dir)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def url
|
|
102
|
+
@url ||= begin
|
|
103
|
+
if bind_address == '0.0.0.0'
|
|
104
|
+
"http://localhost:#{port}/solr"
|
|
105
|
+
else
|
|
106
|
+
"http://#{bind_address}:#{port}/solr"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def parse_url(url)
|
|
112
|
+
uri = URI.parse(url)
|
|
113
|
+
return uri.host, uri.port
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Esssentially sends a message like:
|
|
117
|
+
#
|
|
118
|
+
# http://localhost:8983/solr/admin/cores?action=RELOAD&core=core0
|
|
119
|
+
#
|
|
120
|
+
def reload_core(corename)
|
|
121
|
+
reload_url = "#{url}/admin/cores?action=RELOAD&core=#{corename}"
|
|
122
|
+
response = Net::HTTP.get_response(URI.parse(reload_url))
|
|
123
|
+
if response.code.to_i == 200
|
|
124
|
+
puts "Reloaded #{corename} core"
|
|
125
|
+
else
|
|
126
|
+
raise "Could not reload #{corename}: response #{response.code}. " +
|
|
127
|
+
"Check your solr log: #{log_path}"
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# There is a lag between the time solr starts and it is ready to
|
|
132
|
+
# accept requests. Use +running?+ to determine if the process itself
|
|
133
|
+
# is up.
|
|
134
|
+
def running?
|
|
135
|
+
if File.exists?(pid_path)
|
|
136
|
+
existing_pid = IO.read(pid_path).to_i
|
|
137
|
+
begin
|
|
138
|
+
Process.kill(0, existing_pid)
|
|
139
|
+
return true
|
|
140
|
+
rescue Errno::ESRCH
|
|
141
|
+
return false
|
|
142
|
+
end
|
|
143
|
+
else
|
|
144
|
+
return false
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def status
|
|
149
|
+
if running?
|
|
150
|
+
ctime = File.stat(pid_path).ctime
|
|
151
|
+
pid = IO.read(pid_path).to_i
|
|
152
|
+
puts "Running since #{ctime} with pid #{pid}"
|
|
153
|
+
else
|
|
154
|
+
puts "stopped"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def start
|
|
159
|
+
# TODO make sure java is installed?
|
|
160
|
+
|
|
161
|
+
ensure_dirs!
|
|
162
|
+
|
|
163
|
+
if File.exists?(pid_path)
|
|
164
|
+
existing_pid = IO.read(pid_path).to_i
|
|
165
|
+
begin
|
|
166
|
+
Process.kill(0, existing_pid)
|
|
167
|
+
raise(AlreadyRunningError, "Server is already running with PID #{existing_pid}")
|
|
168
|
+
rescue Errno::ESRCH
|
|
169
|
+
$stderr.puts("Removing stale PID #{pid_path}")
|
|
170
|
+
FileUtils.rm(pid_path)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
@logging_config_path = write_logging_properties
|
|
176
|
+
|
|
177
|
+
# fork the start script, which execs the call to java (thus replaces itself)
|
|
178
|
+
fork do
|
|
179
|
+
pid = fork do
|
|
180
|
+
Process.setsid
|
|
181
|
+
$stdin.reopen('/dev/null')
|
|
182
|
+
$stdout.reopen('/dev/null', 'a')
|
|
183
|
+
$stderr.reopen($stdout)
|
|
184
|
+
run
|
|
185
|
+
end
|
|
186
|
+
write_pid(pid)
|
|
187
|
+
|
|
188
|
+
puts '*'*80
|
|
189
|
+
puts "Solr starting in environment #{environment}, using config #{config_path}"
|
|
190
|
+
puts "and solr home #{solr_home}."
|
|
191
|
+
puts "Server will be available at 'http://#{bind_address}:#{port}/solr'"
|
|
192
|
+
puts "With process id #{pid} and pid file #{pid_path}"
|
|
193
|
+
puts "Logging to #{log_path}"
|
|
194
|
+
puts '*'*80
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def stop(raise_if_not_running = true)
|
|
200
|
+
if File.exist?(pid_path)
|
|
201
|
+
pid = IO.read(pid_path).to_i
|
|
202
|
+
puts "Stopping solr with process #{pid} and pid #{pid_path}"
|
|
203
|
+
|
|
204
|
+
begin
|
|
205
|
+
Process.kill('TERM', pid)
|
|
206
|
+
rescue Errno::ESRCH
|
|
207
|
+
raise NotRunningError, "Process with PID #{pid} is not running!"
|
|
208
|
+
ensure
|
|
209
|
+
FileUtils.rm(pid_path)
|
|
210
|
+
end
|
|
211
|
+
else
|
|
212
|
+
# raise NotRunningError, "Solr is not running. Looking for pid file #{pid_path}"
|
|
213
|
+
if raise_if_not_running
|
|
214
|
+
raise NotRunningError, "Solr is not running. Looking for pid file #{pid_path}"
|
|
215
|
+
else
|
|
216
|
+
puts "Solr not running. Not pid found at #{pid_path}"
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def restart
|
|
223
|
+
stop(false)
|
|
224
|
+
sleep(2)
|
|
225
|
+
start
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def run
|
|
229
|
+
puts '*'*80
|
|
230
|
+
puts "Solr starting in environment #{environment}, using config #{config_path}"
|
|
231
|
+
puts "and solr home #{solr_home}."
|
|
232
|
+
puts "Server will be available at 'http://#{bind_address}:#{port}/solr'"
|
|
233
|
+
puts '*'*80
|
|
234
|
+
|
|
235
|
+
cmd = ["java"]
|
|
236
|
+
cmd << "-server" unless windows?
|
|
237
|
+
cmd << "-Xms#{min_memory}m"
|
|
238
|
+
cmd << "-Xmx#{max_memory}m"
|
|
239
|
+
cmd << "-Djetty.port=#{port}"
|
|
240
|
+
cmd << "-Drails.env=#{environment}" # Only needed while we connect to the db for synonyms
|
|
241
|
+
cmd << "-Dsolr.solr.home=#{solr_home}"
|
|
242
|
+
cmd << "-Dsolr.data.dir=#{solr_data_dir}"
|
|
243
|
+
cmd << "-Djava.io.tmpdir=#{tmp_dir}"
|
|
244
|
+
cmd << "-DRAILS_ENV=#{environment}"
|
|
245
|
+
|
|
246
|
+
if @logging_config_path
|
|
247
|
+
puts "Loading logging configuration from #{@logging_config_path}"
|
|
248
|
+
cmd << "-Dlog4j.configuration=file://#{@logging_config_path}"
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
cmd << "-jar"
|
|
252
|
+
cmd << "start.jar"
|
|
253
|
+
|
|
254
|
+
cmd_s = Escape.shell_command(cmd)
|
|
255
|
+
|
|
256
|
+
puts "RUNNING: #{cmd_s}"
|
|
257
|
+
|
|
258
|
+
# This doesn't work with jruby
|
|
259
|
+
# FileUtils.cd(server_root) do
|
|
260
|
+
# exec("#{cmd_s}")
|
|
261
|
+
# end
|
|
262
|
+
|
|
263
|
+
FileUtils.cd(File.dirname(solr_jar)) do
|
|
264
|
+
require "childprocess"
|
|
265
|
+
process = ChildProcess.build(*cmd)
|
|
266
|
+
|
|
267
|
+
trap('TERM') do
|
|
268
|
+
puts "Stopping solr"
|
|
269
|
+
process.stop
|
|
270
|
+
exit 0
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
trap('INT') do
|
|
274
|
+
puts "Stopping solr"
|
|
275
|
+
process.stop
|
|
276
|
+
exit 0
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
process.io.inherit!
|
|
280
|
+
process.start
|
|
281
|
+
process.wait
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def solr_jar
|
|
287
|
+
"#{server_root}/start.jar"
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def ensure_dirs!
|
|
291
|
+
FileUtils.mkdir_p pid_dir
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def pid_dir
|
|
295
|
+
@pid_dir || File.join(tmp_dir, 'pids')
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def pid_file
|
|
299
|
+
@pid_file || "solr.#{environment}.pid"
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def pid_path
|
|
303
|
+
File.join(pid_dir, pid_file)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def write_pid(pid)
|
|
307
|
+
File.open(pid_path, 'w') {|f| f << pid }
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def environment
|
|
311
|
+
@environment || 'development'
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def tmp_dir
|
|
315
|
+
File.expand_path(@tmp_dir || "#{install_root}/tmp")
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def gem_root
|
|
319
|
+
@gem_root ||= File.expand_path("../../../", __FILE__)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# The directory containing jetty and the solr.war.
|
|
323
|
+
def server_root
|
|
324
|
+
@server_root || File.expand_path('../../../server', __FILE__)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
# Directory where the index directories: index and spelling
|
|
328
|
+
# are kept.
|
|
329
|
+
# Defaults to "#{install_root}/solr/data/#{environment}"
|
|
330
|
+
def solr_data_dir
|
|
331
|
+
@solr_data_dir
|
|
332
|
+
end
|
|
333
|
+
alias_method :data_dir, :solr_data_dir
|
|
334
|
+
|
|
335
|
+
def solr_home
|
|
336
|
+
@solr_home # || "#{install_root}/solr"
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def log_path
|
|
340
|
+
@log_path || "#{log_dir}/solr.#{environment}.log"
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# Write out a java properties files with the necessary
|
|
344
|
+
# key value pairs to initialize log4j correctly.
|
|
345
|
+
# Returns the path to where the properties file is created
|
|
346
|
+
def write_logging_properties
|
|
347
|
+
logging_config_path = File.join(tmp_dir, "solr.#{environment}.log.properties")
|
|
348
|
+
File.open(logging_config_path, 'w') {|f| f.puts logging_config }
|
|
349
|
+
logging_config_path
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
private
|
|
353
|
+
|
|
354
|
+
def logging_config
|
|
355
|
+
<<-LOG_CONFIG
|
|
356
|
+
log4j.rootLogger=#{log_level.to_s.upcase}, file, CONSOLE
|
|
357
|
+
|
|
358
|
+
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
|
|
359
|
+
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
|
|
360
|
+
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n
|
|
361
|
+
|
|
362
|
+
log4j.appender.file=org.apache.log4j.RollingFileAppender
|
|
363
|
+
log4j.appender.file.MaxFileSize=4MB
|
|
364
|
+
log4j.appender.file.MaxBackupIndex=9
|
|
365
|
+
|
|
366
|
+
log4j.appender.file.File=#{log_path}
|
|
367
|
+
log4j.appender.file.layout=org.apache.log4j.PatternLayout
|
|
368
|
+
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m%n
|
|
369
|
+
|
|
370
|
+
log4j.logger.org.apache.zookeeper=WARN
|
|
371
|
+
LOG_CONFIG
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def windows?
|
|
375
|
+
RUBY_PLATFORM =~ /mswin32/ || RUBY_PLATFORM =~ /mingw/
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
end
|