Distributed Search Test

2008-08-27 Thread Ronald Aubin
Hello,
I have been performing some simple distributed search tests and don't
understand why distributed search seems to work in some circumstances but
not others.

In my setup I have compiled the example server using the solr trunk
downloaded on Aug 22nd.  I am running a sample server instance on 2 separate
hosts (localhost and "fred").  I've added a portion of  the sample docs
[a-n]*.xml to the local host solr server, and added the other portion,
[m-z]*.xml sample docs to host fred.

Assuming that I have setup things correctly, I would expect to receive a see
non zero length SolrDocumentList for any distributed search that matches
syntax in the example docs.

Specifically when I test the contents of each server separately ( using the
included TestCase ) the tests pass. This confirms that each server has
different documents.  However when I do the distributed tests, it seems the
tests pass or fail based on the initial URL passed in the
createNewSolrServer(String URL).  I realize a real junit should be self
contained, unlike this one.

junit test  testDistrbutedSearch() passes, while testDistrbutedSearch2()
fails. Why?

My understanding is that each host should send a query to all shards and
collate the responses, and return them to the client. Is this true?

Ron


Here is my TestCase;

package org.apache.solr.client.solrj.ron;

import junit.framework.TestCase;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.SolrPingResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.ShardParams;

public class SolrExampleDistributedTest extends TestCase {

int port = 8983;
static final String context = "/solr";

static String SOLR_SHARD1 = "localhost:8983/solr";
static String SOLR_SHARD2 = "fred:8983/solr";
static String SOLR_SHARDS = SOLR_SHARD1 + "," + SOLR_SHARD2;
static String HTTP_PREFIX = "http://";;
static String SOLR_URL1 = HTTP_PREFIX + SOLR_SHARD1;
static String SOLR_URL2 = HTTP_PREFIX + SOLR_SHARD2;
static String QUERY1 = "Samsung";
static String QUERY2 = "solr";

@Override
public void setUp() throws Exception {
super.setUp();

}

public SolrExampleDistributedTest(String name) {
super(name);
}

@Override
public void tearDown() throws Exception {
super.tearDown();
}

protected SolrServer createNewSolrServer(String url) {
try {

CommonsHttpSolrServer s = new CommonsHttpSolrServer(url);
s.setConnectionTimeout(100); // 1/10th sec
s.setDefaultMaxConnectionsPerHost(100);
s.setMaxTotalConnections(100);
return s;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}

public void testLocalhost() {
try {
SolrServer server = createNewSolrServer(SOLR_URL1);

SolrQuery query = new SolrQuery();
query.setQuery(QUERY1);
QueryResponse qr = server.query(query);
SolrDocumentList sdl = qr.getResults();
assertTrue(sdl.getNumFound() > 0);

query = new SolrQuery();
query.setQuery(QUERY2);
qr = server.query(query);
sdl = qr.getResults();
assertTrue(sdl.getNumFound() == 0);

} catch (Exception ex) {
ex.printStackTrace();
fail();
}
}

public void testRemoteHost() {
try {
SolrServer server = createNewSolrServer(SOLR_URL2);

SolrQuery query = new SolrQuery();
query.setQuery(QUERY1);
QueryResponse qr = server.query(query);
SolrDocumentList sdl = qr.getResults();
assertTrue(sdl.getNumFound() == 0);

query = new SolrQuery();
query.setQuery(QUERY2);
qr = server.query(query);
sdl = qr.getResults();
assertTrue(sdl.getNumFound() > 0);
} catch (Exception ex) {
// expected
ex.printStackTrace();
fail();
}
}

public void testDistrbutedSearch() {
try {
SolrServer server = createNewSolrServer(SOLR_URL1);

SolrQuery query = new SolrQuery();
query.setQuery(QUERY1);

query.setParam(ShardParams.SHARDS, SOLR_SHARDS);
QueryResponse qr = server.query(query);
SolrDocumentList sdl = qr.getResults();
assertTrue(sdl.getNumFound() > 0);

SolrQuery query2 = new SolrQuery();
query2.setQuery(QUERY2);
query2.setParam(ShardParams.SHARDS, SOLR_SHARDS);
QueryResponse qr2 = server.query(query);
SolrDocumentList sdl2 = qr2.getResults();
assertTrue(sdl.getNumFound() >

Re: Distributed Search Test

2008-08-27 Thread Ronald Aubin
Yonik,
  Thanks for your reply.  I'm not sure if I understand completely.   Do you
mean that each solr server should be given a different shard list and not a
list containing all shards?

So in my case:
1) host fred should be given a shard list containing only locahost,
2)  localhost should be given a shard list of fred

I'll give it a try.

Thanks again

Ron

On Wed, Aug 27, 2008 at 12:21 PM, Yonik Seeley <[EMAIL PROTECTED]> wrote:

> It fails because you are using "localhost" as part of a shard name.
> When you send the request to "fred" it uses the "fred" shard and the
> "localhost" shard (which is the same as fred!)
>
> -Yonik
>
> On Wed, Aug 27, 2008 at 12:07 PM, Ronald Aubin <[EMAIL PROTECTED]>
> wrote:
> > Hello,
> >I have been performing some simple distributed search tests and don't
> > understand why distributed search seems to work in some circumstances but
> > not others.
> >
> > In my setup I have compiled the example server using the solr trunk
> > downloaded on Aug 22nd.  I am running a sample server instance on 2
> separate
> > hosts (localhost and "fred").  I've added a portion of  the sample docs
> > [a-n]*.xml to the local host solr server, and added the other portion,
> > [m-z]*.xml sample docs to host fred.
> >
> > Assuming that I have setup things correctly, I would expect to receive a
> see
> > non zero length SolrDocumentList for any distributed search that matches
> > syntax in the example docs.
> >
> > Specifically when I test the contents of each server separately ( using
> the
> > included TestCase ) the tests pass. This confirms that each server has
> > different documents.  However when I do the distributed tests, it seems
> the
> > tests pass or fail based on the initial URL passed in the
> > createNewSolrServer(String URL).  I realize a real junit should be self
> > contained, unlike this one.
> >
> > junit test  testDistrbutedSearch() passes, while testDistrbutedSearch2()
> > fails. Why?
> >
> > My understanding is that each host should send a query to all shards and
> > collate the responses, and return them to the client. Is this true?
> >
> > Ron
> >
> >
> > Here is my TestCase;
> >
> > package org.apache.solr.client.solrj.ron;
> >
> > import junit.framework.TestCase;
> >
> > import org.apache.solr.client.solrj.SolrQuery;
> > import org.apache.solr.client.solrj.SolrServer;
> > import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
> > import org.apache.solr.client.solrj.response.QueryResponse;
> > import org.apache.solr.client.solrj.response.SolrPingResponse;
> > import org.apache.solr.common.SolrDocumentList;
> > import org.apache.solr.common.params.ShardParams;
> >
> > public class SolrExampleDistributedTest extends TestCase {
> >
> >int port = 8983;
> >static final String context = "/solr";
> >
> >static String SOLR_SHARD1 = "localhost:8983/solr";
> >static String SOLR_SHARD2 = "fred:8983/solr";
> >static String SOLR_SHARDS = SOLR_SHARD1 + "," + SOLR_SHARD2;
> >static String HTTP_PREFIX = "http://";;
> >static String SOLR_URL1 = HTTP_PREFIX + SOLR_SHARD1;
> >static String SOLR_URL2 = HTTP_PREFIX + SOLR_SHARD2;
> >static String QUERY1 = "Samsung";
> >static String QUERY2 = "solr";
> >
> >@Override
> >public void setUp() throws Exception {
> >super.setUp();
> >
> >}
> >
> >public SolrExampleDistributedTest(String name) {
> >super(name);
> >}
> >
> >@Override
> >public void tearDown() throws Exception {
> >super.tearDown();
> >}
> >
> >protected SolrServer createNewSolrServer(String url) {
> >try {
> >
> >CommonsHttpSolrServer s = new CommonsHttpSolrServer(url);
> >s.setConnectionTimeout(100); // 1/10th sec
> >s.setDefaultMaxConnectionsPerHost(100);
> >s.setMaxTotalConnections(100);
> >return s;
> >} catch (Exception ex) {
> >throw new RuntimeException(ex);
> >}
> >}
> >
> >public void testLocalhost() {
> >try {
> >SolrServer server = createNewSolrServer(SOLR_URL1);
> >
> >SolrQuery query = new SolrQuery();
> >query.setQuery(QUERY1);
> >   

Re: Distributed Search Test

2008-08-27 Thread Ronald Aubin
Yonik,
I now  perfectly understand. Thanks for your help. All my tests now
work.

Ron

On Wed, Aug 27, 2008 at 12:21 PM, Yonik Seeley <[EMAIL PROTECTED]> wrote:

> It fails because you are using "localhost" as part of a shard name.
> When you send the request to "fred" it uses the "fred" shard and the
> "localhost" shard (which is the same as fred!)
>
> -Yonik
>
> On Wed, Aug 27, 2008 at 12:07 PM, Ronald Aubin <[EMAIL PROTECTED]>
> wrote:
> > Hello,
> >I have been performing some simple distributed search tests and don't
> > understand why distributed search seems to work in some circumstances but
> > not others.
> >
> > In my setup I have compiled the example server using the solr trunk
> > downloaded on Aug 22nd.  I am running a sample server instance on 2
> separate
> > hosts (localhost and "fred").  I've added a portion of  the sample docs
> > [a-n]*.xml to the local host solr server, and added the other portion,
> > [m-z]*.xml sample docs to host fred.
> >
> > Assuming that I have setup things correctly, I would expect to receive a
> see
> > non zero length SolrDocumentList for any distributed search that matches
> > syntax in the example docs.
> >
> > Specifically when I test the contents of each server separately ( using
> the
> > included TestCase ) the tests pass. This confirms that each server has
> > different documents.  However when I do the distributed tests, it seems
> the
> > tests pass or fail based on the initial URL passed in the
> > createNewSolrServer(String URL).  I realize a real junit should be self
> > contained, unlike this one.
> >
> > junit test  testDistrbutedSearch() passes, while testDistrbutedSearch2()
> > fails. Why?
> >
> > My understanding is that each host should send a query to all shards and
> > collate the responses, and return them to the client. Is this true?
> >
> > Ron
> >
> >
> > Here is my TestCase;
> >
> > package org.apache.solr.client.solrj.ron;
> >
> > import junit.framework.TestCase;
> >
> > import org.apache.solr.client.solrj.SolrQuery;
> > import org.apache.solr.client.solrj.SolrServer;
> > import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
> > import org.apache.solr.client.solrj.response.QueryResponse;
> > import org.apache.solr.client.solrj.response.SolrPingResponse;
> > import org.apache.solr.common.SolrDocumentList;
> > import org.apache.solr.common.params.ShardParams;
> >
> > public class SolrExampleDistributedTest extends TestCase {
> >
> >int port = 8983;
> >static final String context = "/solr";
> >
> >static String SOLR_SHARD1 = "localhost:8983/solr";
> >static String SOLR_SHARD2 = "fred:8983/solr";
> >static String SOLR_SHARDS = SOLR_SHARD1 + "," + SOLR_SHARD2;
> >static String HTTP_PREFIX = "http://";;
> >static String SOLR_URL1 = HTTP_PREFIX + SOLR_SHARD1;
> >static String SOLR_URL2 = HTTP_PREFIX + SOLR_SHARD2;
> >static String QUERY1 = "Samsung";
> >static String QUERY2 = "solr";
> >
> >@Override
> >public void setUp() throws Exception {
> >super.setUp();
> >
> >}
> >
> >public SolrExampleDistributedTest(String name) {
> >super(name);
> >}
> >
> >@Override
> >public void tearDown() throws Exception {
> >super.tearDown();
> >}
> >
> >protected SolrServer createNewSolrServer(String url) {
> >try {
> >
> >CommonsHttpSolrServer s = new CommonsHttpSolrServer(url);
> >s.setConnectionTimeout(100); // 1/10th sec
> >s.setDefaultMaxConnectionsPerHost(100);
> >s.setMaxTotalConnections(100);
> >return s;
> >} catch (Exception ex) {
> >throw new RuntimeException(ex);
> >}
> >}
> >
> >public void testLocalhost() {
> >try {
> >SolrServer server = createNewSolrServer(SOLR_URL1);
> >
> >SolrQuery query = new SolrQuery();
> >query.setQuery(QUERY1);
> >QueryResponse qr = server.query(query);
> >SolrDocumentList sdl = qr.getResults();
> >assertTrue(sdl.getNumFound() > 0);
> >
> >query = new SolrQuery();
> >query.setQuery(QUERY2);
> >qr = server.query(query