SOLR-659: add shards.start shards.rows

git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@812246 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yonik Seeley 2009-09-07 18:28:16 +00:00
parent 576e73cd5d
commit 3c96f846cd
4 changed files with 31 additions and 5 deletions

View File

@ -292,7 +292,11 @@ New Features
75. SOLR-1385 : Add an 'enable' attribute to all plugins (noble)
76. SOLR-SOLR-1414 : implicit core properties are not set for single core (noble)
76. SOLR-1414 : implicit core properties are not set for single core (noble)
77. SOLR-659 : Adds shards.start and shards.rows to distributed search
to allow more efficient bulk queries (those that retrieve many or all
documents). (Brian Whitman via yonik)
Optimizations
----------------------

View File

@ -24,6 +24,10 @@ public interface ShardParams {
/** the shards to use (distributed configuration) */
public static final String SHARDS = "shards";
/** per-shard start and rows */
public static final String SHARDS_ROWS = "shards.rows";
public static final String SHARDS_START = "shards.start";
/** IDs of the shard documents */
public static final String IDS = "ids";

View File

@ -114,6 +114,14 @@ public class QueryComponent extends SearchComponent
List<String> lst = StrUtils.splitSmart(shards, ",", true);
rb.shards = lst.toArray(new String[lst.size()]);
}
String shards_rows = params.get(ShardParams.SHARDS_ROWS);
if(shards_rows != null) {
rb.shards_rows = Integer.parseInt(shards_rows);
}
String shards_start = params.get(ShardParams.SHARDS_START);
if(shards_start != null) {
rb.shards_start = Integer.parseInt(shards_start);
}
}
/**
@ -330,14 +338,22 @@ public class QueryComponent extends SearchComponent
// set the start (offset) to 0 for each shard request so we can properly merge
// results from the start.
sreq.params.set(CommonParams.START, "0");
if(rb.shards_start > -1) {
// if the client set shards.start set this explicitly
sreq.params.set(CommonParams.START,rb.shards_start);
} else {
sreq.params.set(CommonParams.START, "0");
}
// TODO: should we even use the SortSpec? That's obtained from the QParser, and
// perhaps we shouldn't attempt to parse the query at this level?
// Alternate Idea: instead of specifying all these things at the upper level,
// we could just specify that this is a shard request.
sreq.params.set(CommonParams.ROWS, rb.getSortSpec().getOffset() + rb.getSortSpec().getCount());
if(rb.shards_rows > -1) {
// if the client set shards.rows set this explicity
sreq.params.set(CommonParams.ROWS,rb.shards_rows);
} else {
sreq.params.set(CommonParams.ROWS, rb.getSortSpec().getOffset() + rb.getSortSpec().getCount());
}
// in this first phase, request only the unique key field
// and any fields needed for merging.

View File

@ -94,6 +94,8 @@ public class ResponseBuilder
//The address of the Shard
public String[] shards;
public int shards_rows = -1;
public int shards_start = -1;
public List<ShardRequest> outgoing; // requests to be sent
public List<ShardRequest> finished; // requests that have received responses from all shards