-
Notifications
You must be signed in to change notification settings - Fork 0
pauldoerwald/lm_solr
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
= Liquid Media's Solr/Rails Integration Library
== Setup
=== Install all your files
1. Unpack this directory somewhere useful; it's your SOLR_HOME.
2. Create a directory to hold the data; it's your SOLR_DATA. Wise people will put SOLR_DATA somewhere other than underneath SOLR_HOME or underneath RAILS_ROOT.
3. Put solr.yml and solr.rb in your RAILS_ROOT/config directory. Sample files appear below. Be sure to adjust solr.yml appropriately to reflect your file layout.
4. Put (script/)solr in your RAILS_ROOT/script directory.
These instructions are not great. I'm still working on design. To get this thing running, talk to Paul.
=== Get things going
From inside RAILS_ROOT, run the following. You should get more-or-less the same thing:
trudeau:/web/wego/wegowego paul$ script/console
Loading development environment (Rails 2.1.2)
>> @solr.ping
=> false
>> @solr.inspect
=> "#<Solr::Connection:0x23f92a4 @connection=#<Net::HTTP localhost:8982 open=false>, @autocommit=false, @url=#<URI::HTTP:0x11fc89e URL:http://localhost:8982/solr>>"
>> @solr.query('hello')
=> #<Solr::Response::Standard:0x1ff7ad4 @raw_response="{'responseHeader'=>{'status'=>0,'QTime'=>1,'params'=>{'wt'=>'ruby','q'=>'hello','fl'=>'*,score','qt'=>'standard'}},'response'=>{'numFound'=>0,'start'=>0,'maxScore'=>0.0,'docs'=>[]}}", @data={"response"=>{"maxScore"=>0.0, "docs"=>[], "start"=>0, "numFound"=>0}, "responseHeader"=>{"status"=>0, "QTime"=>1, "params"=>{"qt"=>"standard", "fl"=>"*,score", "q"=>"hello", "wt"=>"ruby"}}}, @response={"maxScore"=>0.0, "docs"=>[], "start"=>0, "numFound"=>0}, @header={"status"=>0, "QTime"=>1, "params"=>{"qt"=>"standard", "fl"=>"*,score", "q"=>"hello", "wt"=>"ruby"}}>
=== Hook up your models
I need to re-do the instructions here.. Yes, I really do.
Make sure that the solr index is updated appropriately:
after_save :update_solr
after_destroy :destroy_solr
def update_solr
@solr = Solr::Connection.new(SOLR_URL, :autocommit => :on)
# this is a really bad duplication of @@solr_mapping, but it's all on the road to understanding the problem and possibly writing solr-ar
@solr.update(
:id => self.id,
:name_t => self.name,
:alliance_region_facet => self.metadata['alliance_region'],
:state_facet => self.metadata['state'],
:author_facet => self.metadata['author'],
:year_facet => self.metadata['year'],
:publication_type_facet => self.metadata['publication_type'],
:subject_category_facet => self.subject_categories.map {|x| x.name}.join(', '),
:case_name_facet => self.metadata['case_name'],
:common_name_facet => self.metadata['common_name'],
:text => self.metadata.to_s,
:all_search_s => 'all'
)
end
def destroy_solr
@solr = Solr::Connection.new(SOLR_URL, :autocommit => :on)
@solr.delete(self.id)
end
== Solr.rb
require 'solr'
begin
if File.exists?(RAILS_ROOT+'/config/solr.yml')
config = YAML::load_file(RAILS_ROOT+'/config/solr.yml')
SOLR_HOST = config[RAILS_ENV]['host']
SOLR_PORT = config[RAILS_ENV]['port']
SOLR_DATA_PATH = config[RAILS_ENV]['data_path']
SOLR_PATH = config[RAILS_ENV]['solr_path']
SOLR_JAR_NAME = config[RAILS_ENV]['jar_name']
SOLR_URL = "http://#{SOLR_HOST}:#{SOLR_PORT}/solr"
end
@solr = Solr::Connection.new(SOLR_URL)
@solr.ping
rescue
raise "Couldn't connect to the Solr server at #{SOLR_URL}. #{$!}"
return false
end
== solr.yml
# Config file for Liquid Media Solr-Ruby integration
development:
host: localhost
port: 8982
data_path: "/web/lta/solr-data/development"
solr_path: "/web/lta/solr-clearinghouse"
jar_name: "clearinghouse.jar"
test:
host: localhost
port: 8981
data_path: "/web/lta/solr-data/test"
solr_path: "/web/lta/solr-clearinghouse"
jar_name: "clearinghouse.jar"
production:
host: localhost
port: 8984
data_path: "/web/lta/solr-data/production"
solr_path: "/web/lta/solr-clearinghouse"
jar_name: "clearinghouse.jar"
== script/solr
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'yaml'
require 'net/http'
begin
config = YAML::load_file(RAILS_ROOT+'/config/solr.yml')
rescue
raise "Can't load solr.yml in #{RAILS_ROOT}/config"
end
SOLR_HOST = config[RAILS_ENV]['host']
SOLR_PORT = config[RAILS_ENV]['port']
SOLR_DATA_PATH = config[RAILS_ENV]['data_path']
SOLR_PATH = config[RAILS_ENV]['solr_path']
SOLR_JAR_NAME = config[RAILS_ENV]['jar_name']
SOLR_URL = "http://#{SOLR_HOST}:#{SOLR_PORT}/solr"
#puts "HOST: #{SOLR_HOST}; PORT: #{SOLR_PORT}; DATA_PATH: #{SOLR_DATA_PATH}; JAR_NAME: #{SOLR_JAR_NAME}"
#puts "SOLR_URL: #{SOLR_URL}"
case ARGV[0]
when 'start'
begin
n = Net::HTTP.new(SOLR_HOST, SOLR_PORT)
n.request_head('/').value
rescue Net::HTTPServerException #responding
puts "Port #{SOLR_PORT} in use" and return
rescue Errno::ECONNREFUSED #not responding
Dir.chdir(SOLR_PATH) do
pid = fork do
#STDERR.close
exec "nohup java -DSTOP.PORT=#{SOLR_PORT-20} -DSTOP.KEY=ftasolrstop -Dsolr.data.dir=#{SOLR_DATA_PATH} -Djetty.port=#{SOLR_PORT} -jar #{SOLR_JAR_NAME} > #{RAILS_ROOT}/log/solr.#{RAILS_ENV}.log 2> #{RAILS_ROOT}/log/solr.#{RAILS_ENV}.err"
end
sleep(5)
File.open("#{RAILS_ROOT}/tmp/pids/solr-#{ENV['RAILS_ENV']}.pid", "w"){ |f| f << pid}
puts "Solr started successfully on #{SOLR_PORT}, pid: #{pid}."
end
end
when 'stop'
Dir.chdir(SOLR_PATH) do
file_path = "#{RAILS_ROOT}/tmp/pids/solr-#{ENV['RAILS_ENV']}.pid"
if File.exists?(file_path)
# This used to happen:
# File.open(file_path, "r") do |f|
# pid = f.readline
# Process.kill('TERM', pid.to_i)
# end
# But now we use Java to stop the Solr process
fork do
exec "/usr/bin/java -DSTOP.PORT=#{SOLR_PORT-20} -DSTOP.KEY=ftasolrstop -jar #{SOLR_JAR_NAME} --stop"
end
File.unlink(file_path)
puts "Solr shutdown successfully."
else
puts "Solr is not running. I haven't done anything."
end
end
else
puts "Usage: script/solr <start|stop>"
end
About
An integration library for Solr
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published