package com.prismoskills.solrj.pojos;
import org.apache.solr.client.solrj.beans.Field;
public class Item
{
@Field("id")
String id;
@Field("name")
String name;
@Field
Float price;
public Item() {} // Empty constructor is required
public Item(String id, String name, Float price)
{
super();
this.id = id;
this.name = name;
this.price = price;
}
// Getter Setters
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
}
SolrServerFactory.java encapsulates the creation of SolrServer.
package com.prismoskills.solrj;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
public final class SolrServerFactory
{
Map <String, SolrServer> urlToServer = new ConcurrentHashMap <String, SolrServer> ();
static SolrServerFactory instance = new SolrServerFactory ();
public static SolrServerFactory getInstance()
{
return instance;
}
private SolrServerFactory ()
{
}
public SolrServer createServer (String solrURL)
{
if (urlToServer.containsKey(solrURL))
return urlToServer.get(solrURL);
/*
HttpSolrServer is thread-safe and if you are using the following constructor,
you *MUST* re-use the same instance for all requests. If instances are created on
the fly, it can cause a connection leak. The recommended practice is to keep a
static instance of HttpSolrServer per solr server url and share it for all requests.
See https://issues.apache.org/jira/browse/SOLR-861 for more details
*/
SolrServer server = new HttpSolrServer( solrURL );
urlToServer.put(solrURL, server);
return server;
}
}
SolrDao.java is the most important class here.
package com.prismoskills.solrj;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import com.prismoskills.solrj.SolrServerFactory;
public class SolrDao <T>
{
HttpSolrServer server = null;
public SolrDao (String solrURL)
{
server = (HttpSolrServer) SolrServerFactory.getInstance().createServer(solrURL);
configureSolr (server);
}
public void put (T dao)
{
put (createSingletonSet (dao));
}
public void put (Collection<T> dao)
{
try
{
UpdateResponse rsp = server.addBeans (dao);
System.out.println ("Added documents to solr. Time taken = " + rsp.getElapsedTime() + ". " + rsp.toString());
}
catch (SolrServerException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void putDoc (SolrInputDocument doc)
{
putDoc (createSingletonSet(doc));
}
public void putDoc (Collection<SolrInputDocument> docs)
{
try
{
long startTime = System.currentTimeMillis();
UpdateRequest req = new UpdateRequest();
req.setAction( UpdateRequest.ACTION.COMMIT, false, false );
req.add (docs);
UpdateResponse rsp = req.process( server );
System.out.print ("Added documents to solr. Time taken = " + rsp.getElapsedTime() + ". " + rsp.toString());
long endTime = System.currentTimeMillis();
System.out.println (" , time-taken=" + ((double)(endTime-startTime))/1000.00 + " seconds");
}
catch (SolrServerException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public QueryResponse readAll ()
{
SolrQuery query = new SolrQuery();
query.setQuery( "*:*" );
//query.addSortField( "price", SolrQuery.ORDER.asc );
QueryResponse rsp = null;
try
{
rsp = server.query( query );
}
catch (SolrServerException e)
{
e.printStackTrace();
}
return rsp;
}
public SolrDocumentList readAllDocs ()
{
SolrQuery query = new SolrQuery();
query.setQuery( "*:*" );
//query.addSortField( "price", SolrQuery.ORDER.asc );
QueryResponse rsp = null;
try {
rsp = server.query( query );
} catch (SolrServerException e)
{
e.printStackTrace();
return null;
}
SolrDocumentList docs = rsp.getResults();
return docs;
}
private void configureSolr(HttpSolrServer server)
{
server.setMaxRetries(1); // defaults to 0. > 1 not recommended.
server.setConnectionTimeout(5000); // 5 seconds to establish TCP
// The following settings are provided here for completeness.
// They will not normally be required, and should only be used
// after consulting javadocs to know whether they are truly required.
server.setSoTimeout(1000); // socket read timeout
server.setDefaultMaxConnectionsPerHost(100);
server.setMaxTotalConnections(100);
server.setFollowRedirects(false); // defaults to false
// allowCompression defaults to false.
// Server side must support gzip or deflate for this to have any effect.
server.setAllowCompression(false);
}
private <U> Collection<U> createSingletonSet(U dao)
{
if (dao == null)
return Collections.emptySet();
return Collections.singleton(dao);
}
}
SolrjExample.java has the main() function and executes SolrDao functions.
The above can be run as:
mvn clean package
java -jar target/solrj_example-1.0-SNAPSHOT.jar
Starting off class com.prismoskills.solrj.SolrjExample
[main] INFO org.apache.solr.client.solrj.impl.HttpClientUtil - Creating new http client, config:maxConnections=128&maxConnectionsPerHost=32&followRedirects=false
Added documents to solr. Time taken = 238. {responseHeader={status=0,QTime=125}} , time-taken=0.24 seconds
Read SolrDocument{id=1, name=Item 1, price=20.5, price_c=20.5,USD, _version_=1450355752342388736} with id = 1 and content = null
Read SolrDocument{id=2, name=Item 2, price=10.1, price_c=10.1,USD, _version_=1450355752342388737} with id = 2 and content = null
Read SolrDocument{id=3, name=Item 3, price=30.0, price_c=30.0,USD, _version_=1450355752342388738} with id = 3 and content = null
Read SolrDocument{id=id0, name=doc0, price=0.0, price_c=0,USD, _version_=1450356064966934528} with id = id0 and content = null
Read SolrDocument{id=id1, name=doc1, price=1.0, price_c=1,USD, _version_=1450356064967983104} with id = id1 and content = null
Read SolrDocument{id=id2, name=doc2, price=2.0, price_c=2,USD, _version_=1450356064967983105} with id = id2 and content = null
Read SolrDocument{id=id3, name=doc3, price=3.0, price_c=3,USD, _version_=1450356064967983106} with id = id3 and content = null
Read SolrDocument{id=id4, name=doc4, price=4.0, price_c=4,USD, _version_=1450356064967983107} with id = id4 and content = null
Read SolrDocument{id=id5, name=doc5, price=5.0, price_c=5,USD, _version_=1450356064967983108} with id = id5 and content = null
Read SolrDocument{id=id6, name=doc6, price=6.0, price_c=6,USD, _version_=1450356064967983109} with id = id6 and content = null
Added documents to solr. Time taken = 4. {responseHeader={status=0,QTime=0}}
Read item 1, name = Item 1
Read item 2, name = Item 2
Read item 3, name = Item 3
Read item id0, name = doc0
Read item id1, name = doc1
Read item id2, name = doc2
Read item id3, name = doc3
Read item id4, name = doc4
Read item id5, name = doc5
Read item id6, name = doc6
Got a thought to share or found a bug in the code? We'd love to hear from you: