package org.barcelonamedia.uima.reader.solr; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; /** * This class provides an interface to retrieve Solr documents. * All document ids must be first retrieved and stored in-memory, * and then each document retrieved individually. * * TODO: make this an iterable/iterator * * @author jens.grivolla * */ public class SolrDao { /** The logger object. */ private static final Logger logger = Logger.getLogger(SolrCollectionReader.class.toString()); private static final int PAGE_SIZE = 1000; private SolrServer server; private String idField; private String textField; public SolrDao(String server, String idField, String textField) throws IOException { this.idField=idField; this.textField=textField; this.server = new HttpSolrServer(server); } public List<String> getDocIds(String queryString) throws SolrServerException { SolrQuery query = new SolrQuery().setFields(idField).setQuery(queryString).setRows(0); long numResults = server.query(query).getResults().getNumFound(); List<String> docIds = new ArrayList<String>(); for (long i = 0; i < numResults; i+=PAGE_SIZE) { docIds.addAll(getDocIds(queryString,PAGE_SIZE,i)); } return docIds; } private List<String> getDocIds(String queryString, int limit, Long offset) throws SolrServerException { List<String> docIds = new ArrayList<String>(); SolrQuery query = new SolrQuery().setFields(idField).setQuery(queryString).setRows(limit).setStart(offset.intValue()); QueryResponse rsp; rsp = server.query(query); SolrDocumentList docs = rsp.getResults(); for (SolrDocument doc : docs) { String userId = (String) doc.get(idField); docIds.add(userId); } return docIds; } public String getDocText(String docId) throws SolrServerException { SolrQuery query = new SolrQuery(); query.setQuery(idField+":"+docId); //TODO: use safer query construction query.setFields(textField); QueryResponse rsp; rsp = server.query(query); SolrDocumentList docs = rsp.getResults(); if (docs.size() == 0) { logger.info("No such offer: "+docId); } if (docs.size() > 1) { logger.warning(String.format("getDocDetails: %i entries for id %s", docs.size(),docId)); } SolrDocument doc = docs.get(0); return (String) doc.get(textField); } public long getDocNum(String queryString) throws SolrServerException { SolrQuery query = new SolrQuery().setFields(idField).setQuery(queryString).setRows(0); long numResults = server.query(query).getResults().getNumFound(); return numResults; } }