Fwd: svn commit: r702993 - /lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java

View: New views
2 Messages — Rating Filter:   Alert me  

Parent Message unknown Fwd: svn commit: r702993 - /lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java

by Erik Hatcher :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Ryan's commit reminded me of DirectSolrConnection - this looks like an  
even easier thing to plug into solr-(j)ruby than EmbeddedSolrServer.  
I'll take a stab at that soon.  We still should support SolrServer and  
what it offers, but DirectSolrConnection will make things more easily  
transparent at first.

        Erik


Begin forwarded message:

> From: ryan@...
> Date: October 8, 2008 5:23:21 PM EDT
> To: solr-commits@...
> Subject: svn commit: r702993 - /lucene/solr/trunk/src/webapp/src/org/
> apache/solr/servlet/DirectSolrConnection.java
> Reply-To: solr-dev@...
>
> Author: ryan
> Date: Wed Oct  8 14:23:21 2008
> New Revision: 702993
>
> URL: http://svn.apache.org/viewvc?rev=702993&view=rev
> Log:
> SOLR-721 -- DirectSolrConnection now uses CoreContainers
>
> Modified:
>    lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/
> DirectSolrConnection.java
>
> Modified: lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/
> DirectSolrConnection.java
> URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/DirectSolrConnection.java?rev=702993&r1=702992&r2=702993&view=diff
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/
> DirectSolrConnection.java (original)
> +++ lucene/solr/trunk/src/webapp/src/org/apache/solr/servlet/
> DirectSolrConnection.java Wed Oct  8 14:23:21 2008
> @@ -29,8 +29,11 @@
> import org.apache.solr.common.params.SolrParams;
> import org.apache.solr.common.util.ContentStream;
> import org.apache.solr.common.util.ContentStreamBase;
> +import org.apache.solr.core.CoreContainer;
> +import org.apache.solr.core.CoreDescriptor;
> import org.apache.solr.core.SolrConfig;
> import org.apache.solr.core.SolrCore;
> +import org.apache.solr.core.SolrResourceLoader;
> import org.apache.solr.request.QueryResponseWriter;
> import org.apache.solr.request.SolrQueryRequest;
> import org.apache.solr.request.SolrQueryResponse;
> @@ -101,16 +104,19 @@
>       }
>     }
>
> -    // Initialize SolrConfig
> -    SolrConfig config = null;
> +    if( instanceDir == null ) {
> +      instanceDir = SolrResourceLoader.locateInstanceDir();
> +    }
> +
> +    // Initialize
>     try {
> -      config = new SolrConfig(instanceDir,  
> SolrConfig.DEFAULT_CONF_FILE, null);
> -      instanceDir = config.getResourceLoader().getInstanceDir();
> -
> -      // If the Data directory is specified, initialize SolrCore  
> directly
> -      IndexSchema schema = new IndexSchema(config, instanceDir+"/
> conf/schema.xml", null);
> -      core = new SolrCore( null, dataDir, config, schema, null );
> -      parser = new SolrRequestParsers( config );
> +      CoreContainer cores = new CoreContainer(new  
> SolrResourceLoader(instanceDir));
> +      SolrConfig solrConfig = new SolrConfig(instanceDir,  
> SolrConfig.DEFAULT_CONF_FILE, null);
> +      CoreDescriptor dcore = new CoreDescriptor(cores, "",  
> solrConfig.getResourceLoader().getInstanceDir());
> +      IndexSchema indexSchema = new IndexSchema(solrConfig,  
> instanceDir+"/conf/schema.xml", null);
> +      core = new SolrCore( null, dataDir, solrConfig, indexSchema,  
> dcore);
> +      cores.register("", core, false);
> +      parser = new SolrRequestParsers( solrConfig );
>     }
>     catch (Exception ee) {
>       throw new RuntimeException(ee);
>


DirectSolrConnection / JRuby

by Erik Hatcher :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

DirectSolrConnection does work out pretty nicely:


require 'java'
require 'erb'

solr_dist_root = "/Users/erik/apache-solr-1.3.0"
solr_home = "/Users/erik/apache-solr-1.3.0/example/solr"

def require_jars(dir)
   jar_pattern = File.join(dir,"**", "*.jar")
   jar_files = Dir.glob(jar_pattern)

   jar_files.each {|jar_file| require jar_file}
end

require_jars(File.join(solr_dist_root, "lib"))
require_jars(File.join(solr_dist_root, "dist"))

import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer
import org.apache.solr.core.CoreContainer
import org.apache.solr.core.CoreDescriptor
import org.apache.solr.common.params.ModifiableSolrParams
import org.apache.solr.common.params.MapSolrParams
import org.apache.solr.servlet.DirectSolrConnection

container = CoreContainer.new
descriptor = CoreDescriptor.new(container, "core1", solr_home)
core = container.create(descriptor)
container.register("core1", core, false)

class Request
   def initialize(params)
     @params = params
   end

   def handler
     'select'
   end

   def content_type
     'application/x-www-form-urlencoded; charset=utf-8'
   end

   def to_s
     http_params = []
     @params.each do |key,value|
       if value.respond_to? :each
         value.each { |v| http_params <<  
"#{key}=#{ERB::Util::url_encode(v)}" unless v.nil?}
       else
         http_params << "#{key}=#{ERB::Util::url_encode(value)}"  
unless value.nil?
       end
     end

     http_params.join("&")
   end
end

solr = DirectSolrConnection.new(solr_home,File.join(solr_home,"solr",  
"data"),nil)
request = Request.new(:qt => 'standard', :q => '*:*', 'facet.field' =>  
['cat'], :wt=>'ruby')
response = solr.request("/#{request.handler}?#{request.to_s}",nil)
puts response
solr.close
core.close

The response is the raw String response, suitable for eval'ing if  
wt=ruby.

So, for embedded SolrJRuby work, this will be the most transparent way  
to go I think.

The question I have is whether we should concern ourselves with  
SolrJ's CommonsHttpSolrServer?  I suspect if you're in a JRuby  
environment that SolrJ's API will be faster performance-wise than  
eval'ing Ruby responses.  Testing warranted for sure.

        Erik