Example usage for org.apache.solr.client.solrj SolrQuery addField

List of usage examples for org.apache.solr.client.solrj SolrQuery addField

Introduction

In this page you can find the example usage for org.apache.solr.client.solrj SolrQuery addField.

Prototype

public SolrQuery addField(String field) 

Source Link

Usage

From source file:uk.ac.ebi.phenotype.service.StatisticalResultService.java

License:Apache License

public Map<String, List<StatisticalResultBean>> getPvaluesByAlleleAndPhenotypingCenterAndPipeline(
        String alleleAccession, String phenotypingCenter, String pipelineStableId,
        List<String> procedureStableIds, ArrayList<String> resource)
        throws NumberFormatException, SolrServerException {

    Map<String, List<StatisticalResultBean>> results = new HashMap<String, List<StatisticalResultBean>>();
    SolrQuery query = new SolrQuery();

    query.setQuery(StatisticalResultDTO.PHENOTYPING_CENTER + ":\"" + phenotypingCenter + "\" AND "
            + StatisticalResultDTO.PIPELINE_STABLE_ID + ":" + pipelineStableId + " AND "
            + StatisticalResultDTO.ALLELE_ACCESSION_ID + ":\"" + alleleAccession + "\"");
    if (procedureStableIds != null) {
        query.addFilterQuery("(" + StatisticalResultDTO.PROCEDURE_STABLE_ID + ":"
                + StringUtils.join(procedureStableIds, " OR " + StatisticalResultDTO.PROCEDURE_STABLE_ID + ":")
                + ")");
    }/*  w  w  w  .  j  av  a2  s .  c  om*/
    if (resource != null) {
        query.addFilterQuery("(" + StatisticalResultDTO.RESOURCE_NAME + ":"
                + StringUtils.join(resource, " OR " + StatisticalResultDTO.RESOURCE_NAME + ":") + ")");
    }
    query.setRows(Integer.MAX_VALUE);
    query.addField(StatisticalResultDTO.P_VALUE).addField(StatisticalResultDTO.EFFECT_SIZE)
            .addField(StatisticalResultDTO.STATUS).addField(StatisticalResultDTO.STATISTICAL_METHOD)
            .addField(StatisticalResultDTO.ZYGOSITY).addField(StatisticalResultDTO.MALE_CONTROL_COUNT)
            .addField(StatisticalResultDTO.MALE_MUTANT_COUNT)
            .addField(StatisticalResultDTO.FEMALE_CONTROL_COUNT)
            .addField(StatisticalResultDTO.FEMALE_MUTANT_COUNT)
            .addField(StatisticalResultDTO.PARAMETER_STABLE_ID).addField(StatisticalResultDTO.METADATA_GROUP);
    query.set("sort", StatisticalResultDTO.P_VALUE + " asc");

    for (SolrDocument doc : solr.query(query).getResults()) {
        String parameterStableId = doc.getFieldValue(StatisticalResultDTO.PARAMETER_STABLE_ID).toString();
        List<StatisticalResultBean> lb = null;

        if (results.containsKey(parameterStableId)) {
            lb = results.get(parameterStableId);
        } else {
            lb = new ArrayList<StatisticalResultBean>();
            results.put(parameterStableId, lb);
        }

        Double effectSize = doc.containsKey(StatisticalResultDTO.EFFECT_SIZE)
                ? Double.parseDouble(doc.getFieldValue(StatisticalResultDTO.EFFECT_SIZE).toString())
                : 1000000000;
        String status = doc.containsKey(StatisticalResultDTO.STATUS)
                ? doc.getFieldValue(StatisticalResultDTO.STATUS).toString()
                : "no status found";

        lb.add(new StatisticalResultBean(
                Double.parseDouble(doc.getFieldValue(StatisticalResultDTO.P_VALUE).toString()), effectSize,
                status, doc.getFieldValue(StatisticalResultDTO.STATISTICAL_METHOD).toString(), "don't know",
                doc.getFieldValue(StatisticalResultDTO.ZYGOSITY).toString(),
                Integer.parseInt(doc.getFieldValue(StatisticalResultDTO.MALE_CONTROL_COUNT).toString()),
                Integer.parseInt(doc.getFieldValue(StatisticalResultDTO.MALE_MUTANT_COUNT).toString()),
                Integer.parseInt(doc.getFieldValue(StatisticalResultDTO.FEMALE_CONTROL_COUNT).toString()),
                Integer.parseInt(doc.getFieldValue(StatisticalResultDTO.FEMALE_MUTANT_COUNT).toString()),
                doc.getFieldValue(StatisticalResultDTO.METADATA_GROUP).toString()));
    }

    return results;

}

From source file:uk.bl.wa.indexer.WARCIndexer.java

License:Open Source License

/**
 * This extracts metadata from the ArchiveRecord and creates a suitable SolrRecord.
 * Removes the text field if flag set.//from   w  w  w .java 2 s .c  o m
 * 
 * @param archiveName
 * @param record
 * @param isTextIncluded
 * @return
 * @throws IOException
 */
public SolrRecord extract(String archiveName, ArchiveRecord record, boolean isTextIncluded) throws IOException {
    final long start = System.nanoTime();
    ArchiveRecordHeader header = record.getHeader();
    SolrRecord solr = new SolrRecord(archiveName, header);

    if (!header.getHeaderFields().isEmpty()) {
        if (header.getHeaderFieldKeys().contains(HEADER_KEY_TYPE)) {
            if (!checkRecordType((String) header.getHeaderValue(HEADER_KEY_TYPE))) {
                return null;
            }
        } // else we're processing ARCs

        if (header.getUrl() == null)
            return null;
        String fullUrl = header.getUrl();
        log.debug(
                "Current heap usage: " + FileUtils.byteCountToDisplaySize(Runtime.getRuntime().totalMemory()));
        log.debug("Processing " + fullUrl + " from " + archiveName);

        // Check the filters:
        if (this.checkProtocol(fullUrl) == false)
            return null;
        if (this.checkUrl(fullUrl) == false)
            return null;
        if (this.checkExclusionFilter(fullUrl) == false)
            return null;

        // --- Basic headers ---

        // Basic metadata:
        solr.setField(SolrFields.SOURCE_FILE, archiveName + "@" + header.getOffset());
        // solr.setField(SolrFields.SOURCE_FILE_OFFSET,
        // "" + header.getOffset());
        byte[] md5digest = md5.digest(fullUrl.getBytes("UTF-8"));
        String md5hex = new String(Base64.encodeBase64(md5digest));
        solr.setField(SolrFields.SOLR_URL, fullUrl);
        if (addNormalisedURL) {
            solr.setField(SolrFields.SOLR_URL_NORMALISED, urlNormaliser.canonicalize(fullUrl));
        }
        // Get the length, but beware, this value also includes the HTTP headers (i.e. it is the payload_length):
        long content_length = header.getLength();

        // Also pull out the file extension, if any:
        solr.addField(SolrFields.CONTENT_TYPE_EXT, parseExtension(fullUrl));
        // Strip down very long URLs to avoid "org.apache.commons.httpclient.URIException: Created (escaped) uuri > 2083"
        // Trac #2271: replace string-splitting with URI-based methods.
        URL url = null;
        if (fullUrl.length() > 2000)
            fullUrl = fullUrl.substring(0, 2000);
        try {
            url = new URL(fullUrl);
        } catch (MalformedURLException e) {
            // Some URIs causing problem, so try the canonicalizer; in which
            // case try with the full URL.
            log.error(e.getMessage());
            try {
                url = new URL("http://" + canon.urlStringToKey(fullUrl));
            } catch (Exception e2) {
                // If this fails, abandon all hope.
                log.error(e2.getMessage());
                return null;
            }
        }
        // Spot 'slash pages':
        if (url.getPath().equals("/") || url.getPath().equals("")
                || url.getPath().matches("/index\\.[a-z]+$")) {
            solr.setField(SolrFields.SOLR_URL_TYPE, SolrFields.SOLR_URL_TYPE_SLASHPAGE);
            // Spot 'robots.txt':
        } else if (url.getPath().equals("/robots.txt")) {
            solr.setField(SolrFields.SOLR_URL_TYPE, SolrFields.SOLR_URL_TYPE_ROBOTS_TXT);
        } else {
            solr.setField(SolrFields.SOLR_URL_TYPE, SolrFields.SOLR_URL_TYPE_NORMAL);
        }
        // Record the domain (strictly, the host):
        String host = url.getHost();
        solr.setField(SolrFields.SOLR_HOST, host);
        solr.setField(SolrFields.DOMAIN, LinkExtractor.extractPrivateSuffixFromHost(host));
        solr.setField(SolrFields.PUBLIC_SUFFIX, LinkExtractor.extractPublicSuffixFromHost(host));

        Instrument.timeRel("WARCIndexer.extract#total", "WARCIndexer.extract#archeaders", start);

        InputStream tikainput = null;

        // Only parse HTTP headers for HTTP URIs
        if (fullUrl.startsWith("http")) {
            // Parse HTTP headers:
            String statusCode = null;
            if (record instanceof WARCRecord) {
                // There are not always headers! The code should check first.
                String statusLine = HttpParser.readLine(record, "UTF-8");
                if (statusLine != null && statusLine.startsWith("HTTP")) {
                    String firstLine[] = statusLine.split(" ");
                    if (firstLine.length > 1) {
                        statusCode = firstLine[1].trim();
                        try {
                            this.processHeaders(solr, statusCode, HttpParser.parseHeaders(record, "UTF-8"));
                        } catch (ProtocolException p) {
                            log.error("ProtocolException [" + statusCode + "]: "
                                    + header.getHeaderValue(WARCConstants.HEADER_KEY_FILENAME) + "@"
                                    + header.getHeaderValue(WARCConstants.ABSOLUTE_OFFSET_KEY), p);
                        }
                    } else {
                        log.warn("Could not parse status line: " + statusLine);
                    }
                } else {
                    log.warn("Invalid status line: " + header.getHeaderValue(WARCConstants.HEADER_KEY_FILENAME)
                            + "@" + header.getHeaderValue(WARCConstants.ABSOLUTE_OFFSET_KEY));
                }
                // No need for this, as the headers have already been read from the InputStream (above):
                // WARCRecordUtils.getPayload(record);
                tikainput = record;
            } else if (record instanceof ARCRecord) {
                ARCRecord arcr = (ARCRecord) record;
                statusCode = "" + arcr.getStatusCode();
                this.processHeaders(solr, statusCode, arcr.getHttpHeaders());
                arcr.skipHttpHeader();
                tikainput = arcr;
            } else {
                log.error("FAIL! Unsupported archive record type.");
                return solr;
            }

            // Skip recording non-content URLs (i.e. 2xx responses only please):
            if (this.checkResponseCode(statusCode) == false) {
                log.debug("Skipping this record based on status code " + statusCode + ": " + header.getUrl());
                return null;
            }
        }

        // Update the content_length based on what's available:
        content_length = tikainput.available();
        // Record the length:
        solr.setField(SolrFields.CONTENT_LENGTH, "" + content_length);

        // -----------------------------------------------------
        // Headers have been processed, payload ready to cache:
        // -----------------------------------------------------

        // Create an appropriately cached version of the payload, to allow analysis.
        final long hashStreamStart = System.nanoTime();
        HashedCachedInputStream hcis = new HashedCachedInputStream(header, tikainput, content_length);
        tikainput = hcis.getInputStream();
        String hash = hcis.getHash();
        Instrument.timeRel("WARCIndexer.extract#total", "WARCIndexer.extract#hashstreamwrap", hashStreamStart);

        // Prepare crawl date information:
        String waybackDate = (header.getDate().replaceAll("[^0-9]", ""));
        Date crawlDate = getWaybackDate(waybackDate);
        String crawlDateString = parseCrawlDate(waybackDate);

        // Optionally use a hash-based ID to store only one version of a URL:
        String id = null;
        if (hashUrlId) {
            id = hash + "/" + md5hex;
        } else {
            id = waybackDate + "/" + md5hex;
        }
        // Set these last:
        solr.setField(SolrFields.ID, id);
        solr.setField(SolrFields.HASH, hash);

        // -----------------------------------------------------
        // Payload has been cached, ready to check crawl dates:
        // -----------------------------------------------------

        // Query for currently known crawl dates:
        HashSet<Date> currentCrawlDates = new HashSet<Date>();
        if (this.checkSolrForDuplicates && solrServer != null) {
            SolrQuery q = new SolrQuery("id:\"" + id + "\"");
            q.addField(SolrFields.CRAWL_DATES);
            try {
                QueryResponse results = solrServer.query(q);
                if (results.getResults().size() > 0) {
                    SolrDocument fr = results.getResults().get(0);
                    if (fr.containsKey(SolrFields.CRAWL_DATES)) {
                        for (Object cds : fr.getFieldValues(SolrFields.CRAWL_DATES)) {
                            currentCrawlDates.add((Date) cds);
                        }
                    }
                } else {
                    log.debug("No matching entries found.");
                }
            } catch (SolrServerException e) {
                e.printStackTrace();
                // FIXME retry?
            }
        }

        // Is the current date unknown? (inc. no-solr-check case):
        if (!currentCrawlDates.contains(crawlDate)) {
            //  Dates to be merged under the CRAWL_DATES field:
            solr.mergeField(SolrFields.CRAWL_DATES, crawlDateString);
            solr.mergeField(SolrFields.CRAWL_YEARS, extractYear(header.getDate()));
        } else {
            // Otherwise, ensure the all the known dates (i.e. including this one) are copied over:
            for (Date ccd : currentCrawlDates) {
                solr.addField(SolrFields.CRAWL_DATES, formatter.format(ccd));
                solr.addField(SolrFields.CRAWL_YEARS, getYearFromDate(ccd));
            }
            // TODO This could optionally skip re-submission instead?
        }

        // Sort the dates and find the earliest:
        List<Date> dateList = new ArrayList<Date>(currentCrawlDates);
        dateList.add(crawlDate);
        Collections.sort(dateList);
        Date firstDate = dateList.get(0);
        solr.getSolrDocument().setField(SolrFields.CRAWL_DATE, firstDate);
        solr.setField(SolrFields.CRAWL_YEAR, getYearFromDate(firstDate));

        // Use the current value as the waybackDate:
        solr.setField(SolrFields.WAYBACK_DATE, waybackDate);

        // If this is a revisit record, we should just return an update to the crawl_dates:
        if (WARCConstants.WARCRecordType.revisit.name().equals(header.getHeaderValue(HEADER_KEY_TYPE))) {
            if (currentCrawlDates.contains(crawlDate)) {
                return null;
            }
            SolrRecord revisited = new SolrRecord();
            revisited.setField(SolrFields.ID, id);
            revisited.mergeField(SolrFields.CRAWL_DATES, crawlDateString);
            revisited.mergeField(SolrFields.CRAWL_YEARS, extractYear(header.getDate()));
            return revisited;
        }

        // -----------------------------------------------------
        // Apply any annotations:
        // -----------------------------------------------------
        if (ant != null) {
            try {
                ant.applyAnnotations(url.toURI(), solr.getSolrDocument());
            } catch (URISyntaxException e) {
                e.printStackTrace();
                log.error("Failed to annotate " + url + " : " + e);
            }
        }

        // -----------------------------------------------------
        // Payload duplication has been checked, ready to parse:
        // -----------------------------------------------------

        final long analyzeStart = System.nanoTime();
        // Mark the start of the payload.
        tikainput.mark((int) content_length);

        // Pass on to other extractors as required, resetting the stream before each:
        this.wpa.analyse(header, tikainput, solr);
        Instrument.timeRel("WARCIndexer.extract#total", "WARCIndexer.extract#analyzetikainput", analyzeStart);

        // Clear up the caching of the payload:
        hcis.cleanup();

        // Derive normalised/simplified content type:
        processContentType(solr, header, content_length);

        // -----------------------------------------------------
        // Payload analysis complete, now performing text analysis:
        // -----------------------------------------------------

        this.txa.analyse(solr);

        // Remove the Text Field if required
        if (!isTextIncluded) {
            solr.removeField(SolrFields.SOLR_EXTRACTED_TEXT);

        } else {
            // Otherwise, decide whether to store or both store and index
            // the text:
            if (storeText == false) {
                // Copy the text into the indexed (but not stored) field:
                solr.setField(SolrFields.SOLR_EXTRACTED_TEXT_NOT_STORED,
                        (String) solr.getField(SolrFields.SOLR_EXTRACTED_TEXT).getFirstValue());
                // Take the text out of the original (stored) field.
                solr.removeField(SolrFields.SOLR_EXTRACTED_TEXT);
            }
        }
    }
    Instrument.timeRel("WARCIndexerCommand.parseWarcFiles#solrdocCreation", "WARCIndexer.extract#total", start);
    return solr;
}

From source file:xc.mst.action.browse.BrowseRecords.java

License:Open Source License

/**
 * Search for records//from   w  ww.  j  a  v  a 2 s. c  o  m
 */
public String browse() {
    RecordService recordService = (RecordService) MSTConfiguration.getInstance().getBean("RecordService");
    if (log.isDebugEnabled()) {
        log.debug("User entered query::" + query);
    }
    try {
        SolrQuery solrQuery = new SolrQuery();

        // If Query is empty retrieve all records
        if ((query == null) || (query.equals(""))) {
            solrQuery.setQuery("*:*");
        } else {
            if (!StringUtils.isEmpty(identifier)) {
                String qFld = getIdentifiers().get(identifier);
                if (query.indexOf(" ") != -1) {
                    query = "(" + query + ")";
                }
                if (qFld != null) {
                    query = query.replaceAll(":", "\\\\:"); // replacing with \\: and solr ends up thinking the token before : is a field
                                                            //  warning:  replacing the 1st : (the delim between field and text) breaks
                                                            //             the search, no results returned.
                    String q = new String(qFld + ":" + query);
                    solrQuery.setQuery(q);
                    if (log.isDebugEnabled()) {
                        LOG.debug("*** browse() ident=" + qFld + " query=" + q);
                    }
                } else {
                    if (log.isDebugEnabled()) {
                        LOG.debug("*** NO field associated with IDENTIFIER! " + " query=" + query
                                + " identifier=" + identifier);
                    }
                    // solr schema: <copyField source="*_key"  dest="text" />
                    if (query.indexOf(" ") != -1) {
                        query = "(" + query + ")";
                    }
                    // TODO having trouble getting this working, leave as a TODO for now, and drop back to default search on record_id.
                    // (should never get here anyways, an identifier will always be picked.
                    //solrQuery.setQuery("text:"+ query);
                    solrQuery.setQuery(query.replaceAll(":", "\\\\:"));
                }
            } else {
                if (log.isDebugEnabled()) {
                    LOG.debug("*** NO IDENTIFIER FOUND! " + " query=" + query);
                }
                solrQuery.setQuery("*:*");
            }
        }

        StringTokenizer nameTokenizer = new StringTokenizer(selectedFacetNames, "|");
        StringTokenizer valueTokenizer = new StringTokenizer(selectedFacetValues, "|");

        while (nameTokenizer.hasMoreTokens()) {
            String name = nameTokenizer.nextToken();
            String value = valueTokenizer.nextToken();
            addFilterQuery(solrQuery, name, value);
        }

        // Add selected facet to query
        if (addFacetName != null && addFacetName.length() > 0) {
            addFilterQuery(solrQuery, addFacetName, addFacetValue);
            // Add facet names and values to | separated list
            selectedFacetNames = selectedFacetNames + "|" + addFacetName;
            selectedFacetValues = selectedFacetValues + "|" + addFacetValue;
        }

        // Remove selected facet from query
        if (removeFacetName != null && removeFacetName.length() > 0) {
            solrQuery.removeFilterQuery(
                    removeFacetName + ":\"" + removeFacetValue.replaceAll(":", "\\\\:") + "\"");
        }

        if (log.isDebugEnabled()) {
            log.debug("Query after adding/removing facet ::" + query);
            log.debug("After Adding facet names ::" + selectedFacetNames);
            log.debug("After Adding facet values ::" + selectedFacetValues);
        }
        // Create facet names and values List
        StringTokenizer facetNameTokenizer = new StringTokenizer(selectedFacetNames, "|");
        List<String> facetNamesList = new ArrayList<String>();

        StringTokenizer facetValueTokenizer = new StringTokenizer(selectedFacetValues, "|");
        List<String> facetValuesList = new ArrayList<String>();

        StringBuffer newSelectedFacetNames = new StringBuffer();
        StringBuffer newSelectedFacetValues = new StringBuffer();
        String myNameToken = "";
        String myValueToken = "";
        while (facetNameTokenizer.hasMoreTokens()) {
            myNameToken = facetNameTokenizer.nextToken();
            myValueToken = facetValueTokenizer.nextToken();
            if (removeFacetName != null && removeFacetName.length() > 0) {
                // Create facet names String separated by |
                if (!(removeFacetName.equalsIgnoreCase(myNameToken)
                        && removeFacetValue.equalsIgnoreCase(myValueToken))) {
                    newSelectedFacetNames.append("|");
                    newSelectedFacetNames.append(myNameToken);
                    facetNamesList.add(myNameToken);

                    newSelectedFacetValues.append("|");
                    newSelectedFacetValues.append(myValueToken);
                    facetValuesList.add(myValueToken);
                }
            } else {
                facetNamesList.add(myNameToken);
                facetValuesList.add(myValueToken);
            }
        }

        if (removeFacetValue != null && removeFacetValue.length() > 0) {
            selectedFacetNames = newSelectedFacetNames.toString();
            selectedFacetValues = newSelectedFacetValues.toString();
        }

        if (log.isDebugEnabled()) {
            log.debug("After removing facet names(final):" + selectedFacetNames);
            log.debug("After removing facet values(final):" + selectedFacetValues);
        }

        // Query formation
        solrQuery.setFacet(true).setFacetMinCount(1);
        solrQuery.addFacetField("status");
        solrQuery.addFacetField("provider_name");
        solrQuery.addFacetField("service_name");
        solrQuery.addFacetField("format_name");
        solrQuery.addFacetField("set_name");
        solrQuery.addFacetField("error");

        // Fields to load
        solrQuery.addField(RecordService.FIELD_RECORD_ID);
        solrQuery.addField(RecordService.FIELD_FORMAT_ID);
        solrQuery.addField(RecordService.FIELD_PROVIDER_ID);
        solrQuery.addField(RecordService.FIELD_SERVICE_ID);
        solrQuery.addField(RecordService.FIELD_HARVEST_SCHEDULE_NAME);
        solrQuery.addField(RecordService.FIELD_ERROR);
        solrQuery.addField(RecordService.FIELD_PROCESSED_FROM);
        solrQuery.addField(RecordService.FIELD_SUCCESSOR);
        solrQuery.addField(RecordService.FIELD_OAI_IDENTIFIER);

        getIdentifiers();

        rowEnd = rowStart + numberOfResultsToShow;

        // In initial page load, we are not going to show any records. Only facets will be shown
        if (isInitialLoad) {
            solrQuery.setStart(0);
            solrQuery.setRows(0);
        } else {
            solrQuery.setStart(rowStart);
            solrQuery.setRows(numberOfResultsToShow);
        }
        BrowseRecordService browseRecordService = (BrowseRecordService) MSTConfiguration.getInstance()
                .getBean("BrowseRecordService");
        result = browseRecordService.search(solrQuery);

        if (log.isDebugEnabled()) {
            log.debug("Search result::" + result);
        }

        if ((result != null) && (rowEnd > result.getTotalNumberOfResults())) {
            rowEnd = result.getTotalNumberOfResults();
        }

        // Add facet name and value list to SolrBrowseResult(result) object for display in UI
        if (result != null) {
            for (int i = 0; i < facetNamesList.size(); i++) {
                // Get successor/predecessor of the record to display its information
                if (facetNamesList.get(i).equalsIgnoreCase("successor")) {
                    successorRecord = recordService.getById(Long.parseLong(facetValuesList.get(i)));
                }
                if (facetNamesList.get(i).equalsIgnoreCase("processed_from")) {

                    predecessorRecord = recordService.getById(Long.parseLong(facetValuesList.get(i)));
                }

                result.addFacetFilter(new FacetFilter(facetNamesList.get(i), facetValuesList.get(i)));
            }
        }
    } catch (DatabaseConfigException dce) {
        log.error(
                "Search failed. Problem with connecting to database using the parameters in configuration file.",
                dce);
        errorType = "error";
        addFieldError("dbError",
                "Search failed.Problem with connecting to database using the parameters in configuration file.");
        return INPUT;
    } catch (IndexException ie) {
        log.error("Search failed. Problem with connecting to Solr server. Check the path to solr folder.", ie);
        errorType = "error";
        addFieldError("dbError",
                "Search failed. Problem with connecting to Solr server. Check the path to solr folder.");
        return INPUT;
    }

    return SUCCESS;
}

From source file:xc.mst.manager.record.DefaultRecordService.java

License:Open Source License

@Override
public SolrBrowseResult getOutgoingRecordsInRange(Date from, Date until, Set set, int formatId, int offset,
        int numResults, int serviceId) throws IndexException {
    // True if we're getting the records for a specific set, false if we're getting all records
    boolean useSet = (set != null);

    // True if we're getting the count for a specific metadataPrefix, false if we're getting it for all records
    boolean useMetadataPrefix = (formatId > 0);

    if (log.isDebugEnabled())
        log.debug("Getting the records updated later than " + from + " and earlier than " + until
                + (useSet ? " in set with setSPec " + set.getSetSpec() : "")
                + (useMetadataPrefix ? " with format ID " + formatId : ""));

    // Create a query to get the Documents for unprocessed records
    SolrQuery query = new SolrQuery();
    StringBuffer queryBuffer = new StringBuffer();

    if (useSet)//from   ww w  .ja v a 2s.  c  om
        queryBuffer.append(FIELD_SET_SPEC).append(":").append(set.getSetSpec());
    if (useSet && useMetadataPrefix)
        queryBuffer.append(" AND ");
    if (useMetadataPrefix)
        queryBuffer.append(FIELD_FORMAT_ID + ":").append(Integer.toString(formatId));

    if (useSet || useMetadataPrefix)
        queryBuffer.append(" AND ");

    queryBuffer.append(FIELD_SERVICE_ID).append(":").append(Integer.toString(serviceId));

    // Get only fields OAI header & OAI XML
    query.addField(FIELD_OAI_HEADER);
    query.addField(FIELD_OAI_XML);
    query.addField(FIELD_DELETED);
    query.setQuery(queryBuffer.toString());
    if (from != null && until != null) {
        query.addFilterQuery(
                FIELD_UPDATED_AT + ":[" + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(from))
                        + " TO " + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(until)) + "]");
    }

    if (from != null && until == null) {
        query.addFilterQuery(FIELD_UPDATED_AT + ":["
                + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(from)) + " TO *]");
    }

    if (from == null && until != null) {
        query.addFilterQuery(FIELD_UPDATED_AT + ":[ * TO "
                + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(until)) + "]");
    }

    query.setStart(offset);
    query.setRows(numResults);
    SolrDocumentList docs = ((SolrIndexManager) config.getBean("SolrIndexManager")).getDocumentList(query);
    Iterator<SolrDocument> iteration = docs.iterator();
    List<Record> records = new ArrayList<Record>();

    while (iteration.hasNext()) {
        records.add(getRecordXMLFromDocument(iteration.next()));
    }

    SolrBrowseResult result = new SolrBrowseResult(records);
    result.setTotalNumberOfResults(docs.getNumFound());

    // Return the empty list if we couldn't find the records
    if (result.getTotalNumberOfResults() == 0) {
        if (log.isDebugEnabled())
            log.debug("Could not find any records updated later than " + from + " and earlier than " + until
                    + (useSet ? " in set with setSPec " + set.getSetSpec() : "")
                    + (useMetadataPrefix ? " with format ID " + formatId : ""));

    } else {
        if (log.isDebugEnabled())
            log.debug("Found " + records.size() + " records updated later than " + from + " and earlier than "
                    + until + (useSet ? " in set with setSPec " + set.getSetSpec() : "")
                    + (useMetadataPrefix ? " with format ID " + formatId : ""));
    }

    return result;
}