【问题标题】:Is it possible do embed a Solr server inside a JRuby on Rails app?是否可以在 JRuby on Rails 应用程序中嵌入 Solr 服务器?
【发布时间】:2012-01-09 15:52:04
【问题描述】:
我想在 Ruby on Rails 应用程序(将部署在 JRuby 环境中)中使用 Solr 和 Sunspot。
但该应用程序将分发给最终用户,我想让安装过程尽可能简单。所以我不想让最终用户(不一定是具有强大软件部署/开发技能的人)自己安装 Solr,我希望 webapp 嵌入一个 Solr 服务器。
我考虑过使用http://wiki.apache.org/solr/EmbeddedSolr,但效果不佳,尤其是使用 Sunspot。
我的第一个想法是提取 Solr jars 和 web.xml,将其放入我的 Rails 应用程序并将 Sunspot 指向我的本地应用程序,但我想知道是否有人做过,是否有更简单的方法.
【问题讨论】:
标签:
ruby-on-rails
solr
jruby
sunspot
【解决方案1】:
Sunspot 使用RSolr 与 Solr 通信。 RSolr 使用 Solr 的标准 HTTP 接口。因此,如果您想使用嵌入式 Solr,则必须使用 SolrJ,或者以某种方式调整 Sunspot 以使用 SolrJ 而不是 RSolr。
不过,在使用嵌入式 Solr 之前,我还是会三思而后行(请参阅 wiki)。如果您使用附带的 Jetty,Solr 不需要任何安装过程。
【解决方案2】:
我使用 jruby 和 solrj 以基本的方式完成了这个工作。 solr 有大量的依赖项,我没有时间准确计算出所有 solr 组件都需要哪些 jar。所以下面的类会运行默认的 solr 和 lucene 下载,需要所有的 jars...不是很高效。
下载 Lucene 4.1、Solr 4.1、commons-fileupload-1.2.2.jar 和 jackson-4.0.6-jar-with-dependencies.jar。最后一个仅用于 com.google.common.cache.CacheBuilder 类。我在别处找不到。
将它们放在 solr-jars 目录中。将以下内容保存在 .rb 文件中并使用 jruby 运行它。
require 'java'
module Solr
class SolrServer
include_package 'org.apache.solr.core'
include_package 'org.apache.solr.client.solrj'
include_package 'org.apache.solr.client.solrj.embedded'
include_package 'org.apache.lucene'
def initialize(jarpath, solr_home, core)
Dir["#{jarpath}/**/*.jar"].each { |f| puts f; require f;}
java.lang.System.setProperty('solr.solr.home',solr_home)
initializer = CoreContainer::Initializer.new
coreContainer = initializer.initialize__method()
@server = EmbeddedSolrServer.new(coreContainer,core)
end
def query(q)
solr_query = SolrQuery.new
solr_query.setQuery q
puts @server.query(solr_query)
end
end
end
solr = Solr::SolrServer.new('solr-jars','solr-jars/solr-4.1.0/example/solr','collection1')
solr.query("*:*")