SOLR-2742: Add commitWithin to convenience signatures for SolrServer.add(..)

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1170569 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jan Høydahl 2011-09-14 12:28:29 +00:00
parent b48164a275
commit 34dce548e3
4 changed files with 213 additions and 11 deletions

View File

@ -175,6 +175,9 @@ New Features
Optimizations
----------------------
* SOLR-2742: SolrJ: Provide commitWithinMs as optional parameter for all add() methods,
making the feature more conveniently accessible for developers (janhoy)
* SOLR-1875: Per-segment field faceting for single valued string fields.
Enable with facet.method=fcs, control the number of threads used with
the "threads" local param on the facet.field param. This algorithm will

View File

@ -42,83 +42,237 @@ import org.apache.solr.common.util.NamedList;
*/
public abstract class SolrServer implements Serializable
{
private static final long serialVersionUID = 1L;
private DocumentObjectBinder binder;
public UpdateResponse add(Collection<SolrInputDocument> docs ) throws SolrServerException, IOException {
/**
* Adds a collection of documents
* @param docs the collection of documents
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse add(Collection<SolrInputDocument> docs) throws SolrServerException, IOException {
return add(docs, -1);
}
/**
* Adds a collection of documents, specifying max time before they become committed
* @param docs the collection of documents
* @param commitWithinMs max time (in ms) before a commit will happen
* @throws SolrServerException
* @throws IOException
* @since solr 3.4
*/
public UpdateResponse add(Collection<SolrInputDocument> docs, int commitWithinMs) throws SolrServerException, IOException {
UpdateRequest req = new UpdateRequest();
req.add(docs);
req.setCommitWithin(commitWithinMs);
return req.process(this);
}
/**
* Adds a collection of beans
* @param beans the collection of beans
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse addBeans(Collection<?> beans ) throws SolrServerException, IOException {
return addBeans(beans, -1);
}
/**
* Adds a collection of beans specifying max time before they become committed
* @param beans the collection of beans
* @param commitWithinMs max time (in ms) before a commit will happen
* @throws SolrServerException
* @throws IOException
* @since solr 3.4
*/
public UpdateResponse addBeans(Collection<?> beans, int commitWithinMs) throws SolrServerException, IOException {
DocumentObjectBinder binder = this.getBinder();
ArrayList<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(beans.size());
for (Object bean : beans) {
docs.add(binder.toSolrInputDocument(bean));
}
return add(docs);
return add(docs, commitWithinMs);
}
/**
* Adds a single document
* @param doc the input document
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse add(SolrInputDocument doc ) throws SolrServerException, IOException {
return add(doc, -1);
}
/**
* Adds a single document specifying max time before it becomes committed
* @param doc the input document
* @param commitWithinMs max time (in ms) before a commit will happen
* @throws SolrServerException
* @throws IOException
* @since solr 3.4
*/
public UpdateResponse add(SolrInputDocument doc, int commitWithinMs) throws SolrServerException, IOException {
UpdateRequest req = new UpdateRequest();
req.add(doc);
req.setCommitWithin(commitWithinMs);
return req.process(this);
}
/**
* Adds a single bean
* @param obj the input bean
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse addBean(Object obj) throws IOException, SolrServerException {
return add(getBinder().toSolrInputDocument(obj));
return addBean(obj, -1);
}
/** waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
/**
* Adds a single bean specifying max time before it becomes committed
* @param obj the input bean
* @param commitWithinMs max time (in ms) before a commit will happen
* @throws SolrServerException
* @throws IOException
* @since solr 3.4
*/
public UpdateResponse addBean(Object obj, int commitWithinMs) throws IOException, SolrServerException {
return add(getBinder().toSolrInputDocument(obj),commitWithinMs);
}
/**
* Performs an explicit commit, causing pending documents to be committed for indexing
* <p>
* waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse commit( ) throws SolrServerException, IOException {
return commit(true, true);
}
/** waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
/**
* Performs an explicit optimize, causing a merge of all segments to one.
* <p>
* waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
* <p>
* Note: In most cases it is not required to do explicit optimize
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse optimize( ) throws SolrServerException, IOException {
return optimize(true, true, 1);
}
/**
* Performs an explicit commit, causing pending documents to be committed for indexing
* @param waitFlush block until index changes are flushed to disk
* @param waitSearcher block until a new searcher is opened and registered as the main query searcher, making the changes visible
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse commit( boolean waitFlush, boolean waitSearcher ) throws SolrServerException, IOException {
return new UpdateRequest().setAction( UpdateRequest.ACTION.COMMIT, waitFlush, waitSearcher ).process( this );
}
/**
* Performs an explicit optimize, causing a merge of all segments to one.
* <p>
* Note: In most cases it is not required to do explicit optimize
* @param waitFlush block until index changes are flushed to disk
* @param waitSearcher block until a new searcher is opened and registered as the main query searcher, making the changes visible
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse optimize( boolean waitFlush, boolean waitSearcher ) throws SolrServerException, IOException {
return optimize(waitFlush, waitSearcher, 1);
}
/**
* Performs an explicit optimize, causing a merge of all segments to one.
* <p>
* Note: In most cases it is not required to do explicit optimize
* @param waitFlush block until index changes are flushed to disk
* @param waitSearcher block until a new searcher is opened and registered as the main query searcher, making the changes visible
* @param maxSegments optimizes down to at most this number of segments
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher, int maxSegments ) throws SolrServerException, IOException {
return new UpdateRequest().setAction( UpdateRequest.ACTION.OPTIMIZE, waitFlush, waitSearcher, maxSegments ).process( this );
}
/**
* Performs a rollback of all non-committed documents pending.
* <p>
* Note that this is not a true rollback as in databases. Content you have previously
* added may have been committed due to autoCommit, buffer full, other client performing
* a commit etc.
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse rollback() throws SolrServerException, IOException {
return new UpdateRequest().rollback().process( this );
}
/**
* Deletes a single document by unique ID
* @param id the ID of the document to delete
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse deleteById(String id) throws SolrServerException, IOException {
return new UpdateRequest().deleteById( id ).process( this );
}
/**
* Deletes a list of documents by unique ID
* @param ids the list of document IDs to delete
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse deleteById(List<String> ids) throws SolrServerException, IOException {
return new UpdateRequest().deleteById( ids ).process( this );
}
/**
* Deletes documents from the index based on a query
* @param query the query expressing what documents to delete
* @throws SolrServerException
* @throws IOException
*/
public UpdateResponse deleteByQuery(String query) throws SolrServerException, IOException {
return new UpdateRequest().deleteByQuery( query ).process( this );
}
/**
* Issues a ping request to check if the server is alive
* @throws SolrServerException
* @throws IOException
*/
public SolrPingResponse ping() throws SolrServerException, IOException {
return new SolrPing().process( this );
}
/**
* Performs a query to the Solr server
* @param params an object holding all key/value parameters to send along the request
* @throws SolrServerException
*/
public QueryResponse query(SolrParams params) throws SolrServerException {
return new QueryRequest( params ).process( this );
}
/**
* Performs a query to the Solr server
* @param params an object holding all key/value parameters to send along the request
* @param method specifies the HTTP method to use for the request, such as GET or POST
* @throws SolrServerException
*/
public QueryResponse query(SolrParams params, METHOD method) throws SolrServerException {
return new QueryRequest( params, method ).process( this );
}

View File

@ -62,6 +62,8 @@ import org.slf4j.LoggerFactory;
*/
public class CommonsHttpSolrServer extends SolrServer
{
private static final long serialVersionUID = 1L;
/**
* User-Agent String as identified by the HTTP request by the {@link
* org.apache.commons.httpclient.HttpClient HttpClient} to the Solr
@ -613,27 +615,46 @@ public class CommonsHttpSolrServer extends SolrServer
/**
* Adds the documents supplied by the given iterator.
*
* @param docIterator the iterator which returns SolrInputDocument instances
*
* @return the response from the SolrServer
*/
public UpdateResponse add(Iterator<SolrInputDocument> docIterator)
throws SolrServerException, IOException {
return add(docIterator, -1);
}
/**
* Adds the documents supplied by the given iterator, specifying max time before they become committed
* @param docIterator the iterator which returns SolrInputDocument instances
* @param commitWithinMs the time in milliseconds before a commit automatically is triggered
* @return the response from the SolrServer
*/
public UpdateResponse add(Iterator<SolrInputDocument> docIterator, int commitWithinMs)
throws SolrServerException, IOException {
UpdateRequest req = new UpdateRequest();
req.setDocIterator(docIterator);
req.setDocIterator(docIterator);
req.setCommitWithin(commitWithinMs);
return req.process(this);
}
/**
* Adds the beans supplied by the given iterator.
*
* Adds the beans supplied by the given iterator
* @param beanIterator the iterator which returns Beans
*
* @return the response from the SolrServer
*/
public UpdateResponse addBeans(final Iterator<?> beanIterator)
throws SolrServerException, IOException {
return addBeans(beanIterator, -1);
}
/**
* Adds the beans supplied by the given iterator, specifying max time before they become committed
* @param commitWithinMs the time in milliseconds before a commit automatically is triggered
* @param beanIterator the iterator which returns Beans
* @return the response from the SolrServer
*/
public UpdateResponse addBeans(final Iterator<?> beanIterator, int commitWithinMs)
throws SolrServerException, IOException {
UpdateRequest req = new UpdateRequest();
req.setDocIterator(new Iterator<SolrInputDocument>() {
@ -651,6 +672,7 @@ public class CommonsHttpSolrServer extends SolrServer
beanIterator.remove();
}
});
req.setCommitWithin(commitWithinMs);
return req.process(this);
}
}

View File

@ -377,6 +377,29 @@ abstract public class SolrExampleTests extends SolrJettyTestBase
}
Assert.assertEquals( 1, rsp.getResults().getNumFound() );
// Now test the new convenience parameter on the add() for commitWithin
SolrInputDocument doc4 = new SolrInputDocument();
doc4.addField( "id", "id4", 1.0f );
doc4.addField( "name", "doc4", 1.0f );
doc4.addField( "price", 10 );
server.add(doc4, 500);
Thread.sleep( 1000 ); // wait 1 sec
// now check that it comes out...
rsp = server.query( new SolrQuery( "id:id4") );
if(rsp.getResults().getNumFound() == 0) {
// wait and try again for slower machines
Thread.sleep( 2000 ); // wait 2 seconds...
rsp = server.query( new SolrQuery( "id:id4") );
}
Assert.assertEquals( 1, rsp.getResults().getNumFound() );
}