I found a couple more things for you.

Your modifyRequest method won't get called, because in the default
/autosuggest the termsComp is the only component.

  /** Called after another component adds a request */
  public void modifyRequest(ResponseBuilder rb, SearchComponent who,
ShardRequest sreq) {
  }

<searchComponent name="termsComp"
class="org.apache.solr.handler.component.TermsComponent"/>
  <requestHandler name="/autoSuggest"
class="org.apache.solr.handler.component.SearchHandler">
    <arr name="components">
    <str>termsComp</str>
    </arr>
</requestHandler>

You should move the logic from modifyRequest (since there isn't going to
be another component creating a shard request for you to modify) to
distributeProcess

I lifted this from QueryComponent.

  @Override
  public int distributedProcess(ResponseBuilder rb) throws IOException {
    if (rb.stage == ResponseBuilder.STAGE_EXECUTE_QUERY) {
      TermsInfo ti = rb._termsInfo;
      if (ti == null) {
        ti = rb._termsInfo = new TermsInfo();
        ti.init(rb.req.getParams());
      }
      createMainQuery(rb);
    }
    if (rb.stage < ResponseBuilder.STAGE_EXECUTE_QUERY){ 
      return ResponseBuilder.STAGE_EXECUTE_QUERY;
    }else {
      return ResponseBuilder.STAGE_DONE;
    }
  }

  private void createMainQuery(ResponseBuilder rb) {
    ShardRequest sreq = new ShardRequest();
    sreq.purpose = ShardRequest.PURPOSE_GET_TERMS;

    sreq.params = new ModifiableSolrParams(rb.req.getParams());
    // TODO: base on current params or original params?

    // don't pass through any shards param
    sreq.params.remove(ShardParams.SHARDS);


        //Add what ever else you need.

    rb.addRequest(this, sreq);
  }



Make sure you add shards.qt to your original request.  I set it to
shards.qt=/autosuggest.  If you don't the shard request will be send to
/select instead of /autoSuggest.

Matt Woytowitz

-----Original Message-----
From: Matt Weber [mailto:m...@mattweber.org] 
Sent: Thursday, May 21, 2009 5:03 PM
To: solr-dev@lucene.apache.org
Subject: Re: Help Writing a Distributed Component

Thanks Matt that worked!  My patch still doesn't work correctly, but  
at least I can actually get it calling the distributed methods now.   
Do you mind explaining how you run solr though a debugger?  That would  
sure make things easier for me!  Thanks again, I really appreciate  
your help.

Thanks,

Matt Weber
eSr Technologies
http://www.esr-technologies.com




On May 21, 2009, at 1:28 PM, Woytowitz, Matthew wrote:

> Matt,
>
> I applied you patch to the trunk and tossed it in the debugger.  I'm  
> not
> sure how your solrconfig.xml looks, but if your using the out of the  
> box
> autosuggest shards don't work.
>
> The reason is that the default search handler has the QueryComponent  
> in
> it's list and the autosuggest doesn't.
>
> Try stealing these lines from the end QueryComponent.prepare
>
>    // TODO: temporary... this should go in a different component.
>    String shards = params.get(ShardParams.SHARDS);
>    if (shards != null) {
>      List<String> lst = StrUtils.splitSmart(shards, ",", true);
>      rb.shards = lst.toArray(new String[lst.size()]);
>    }
>
> Matt Woytowitz
>
>
> -----Original Message-----
> From: Matt Weber [mailto:m...@mattweber.org]
> Sent: Wednesday, May 20, 2009 12:07 PM
> To: solr-dev@lucene.apache.org
> Subject: Re: Help Writing a Distributed Component
>
> Hey Grant,
>
> I have opened a new ticket with the current version of my patch at
> https://issues.apache.org/jira/browse/SOLR-1177
> .  What do you mean by configuring my shards?  I implemented the
> distributed methods (prepare, process, modifyRequest, etc) as is done
> in the other distributed components, then I just specify a shards
> parameter in the query.  I looked though the other distributed
> components and did not see them doing any special shard configuration
> other than modifying the query that is sent to the shards.  I must be
> missing something, but I can't seem to figure out due to my lack of
> knowledge on distributed components and the solr codebase in general.
> Thanks for your help!
>
> For my testing, I have 2 instances of Solr running in tomcat called
> solr1 and solr2.  My test query looks like:
>
>
http://localhost:8080/solr1/terms?shards=localhost:8080/solr1,localhost 
> :
> 8080/solr2&terms=true&terms.fl=spell&terms.prefix=f&terms.lower=f
>
> Thanks,
>
> Matt Weber
> eSr Technologies
> http://www.esr-technologies.com
>
>
> On May 20, 2009, at 7:24 AM, Grant Ingersoll wrote:
>
>> Matt,
>>
>> Perhaps you can post your patch even in it's current state on a JIRA
>> issue and then we can work through it?  Also, how are you
>> configuring your shards?
>>
>> I started that Wiki page as a way to make sure I understood what was
>> going on in distributed.  I'm not 100% sure it is correct, so it
>> would be good if others review/edit as well.
>>
>> -Grant
>>
>> On May 20, 2009, at 1:36 AM, Matt Weber wrote:
>>
>>> Hi all,
>>>
>>> I am working on a patch to get TermsComponent distributed and have
>>> run into a problem.  I have overridden the prepare, process,
>>> modifyRequest, handleResponses, and finishStage methods as
>>> described at
> http://wiki.apache.org/solr/WritingDistributedSearchComponents
>>> .  My problem is that only the prepare and process methods are
>>> called just as if it was non-distributed.  It looks like the shards
>>> parameter is not being honored for this handler.  For some reason
>>> rb.shards is always null.  I looked though all the other
>>> distributed components code (facets, stats, highlighting, etc) and
>>> did not notice them doing anything special that my handler is not.
>>> Is there some setting I need to enable for the shards parameter to
>>> be honored?
>>
>

Reply via email to