【问题标题】: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.jarjackson-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("*:*")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2011-03-18
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        相关资源
        最近更新 更多