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

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

Introduction

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

Prototype

public SolrQuery addDateRangeFacet(String field, Date start, Date end, String gap) 

Source Link

Document

Add a numeric range facet.

Usage

From source file:com.frank.search.solr.core.DefaultQueryParser.java

License:Apache License

private void appendFieldFacetingByDateRange(SolrQuery solrQuery, FieldWithDateRangeParameters field) {
    solrQuery.addDateRangeFacet( //
            field.getName(), //
            field.getStart(), //
            field.getEnd(), //
            field.getGap());/*  w w  w .j a  v  a2 s.  c  om*/
}

From source file:edu.vt.vbi.patric.cache.DataLandingGenerator.java

License:Apache License

private JSONObject getGenomeCounts() {
    JSONArray series = new JSONArray();

    // TODO: reimplement with json facet using sub faceting
    SolrQuery queryComplete = new SolrQuery("genome_status:Complete");
    SolrQuery queryWGS = new SolrQuery("genome_status:WGS");

    queryComplete.setFacet(true).setRows(0).setFacetSort(FacetParams.FACET_SORT_INDEX);
    //.set("json.facet", "{genome_count:{range:{field:completion_date,start:\"2010-01-01T00:00:00.000Z\",end:\"2016-01-01T00:00:00.000Z\",gap:\"%2B1YEAR\",other:\"before\"}}}");
    queryWGS.setFacet(true).setRows(0).setFacetSort(FacetParams.FACET_SORT_INDEX);
    //.set("json.facet", "{genome_count:{range:{field:completion_date,start:\"2010-01-01T00:00:00.000Z\",end:\"2016-01-01T00:00:00.000Z\",gap:\"%2B1YEAR\",other:\"before\"}}}");

    try {//from   w  ww  .  j a  va 2  s. com
        Date rangeStartDate = DateUtil.parseDate("2010-01-01'T'00:00:00.000'Z'");
        Date rangeEndDate = DateUtil.parseDate("2016-01-01'T'00:00:00.000'Z'");

        queryComplete.addDateRangeFacet("completion_date", rangeStartDate, rangeEndDate, "+1YEAR")
                .add(FacetParams.FACET_RANGE_OTHER, "before");
        queryWGS.addDateRangeFacet("completion_date", rangeStartDate, rangeEndDate, "+1YEAR")
                .add(FacetParams.FACET_RANGE_OTHER, "before");
    } catch (java.text.ParseException e) {
        LOGGER.error(e.getMessage(), e);
    }

    try {
        LOGGER.debug("getGenomeCount: [{}] {}", SolrCore.GENOME.getSolrCoreName(), queryComplete);

        String apiResponse = dataApi.solrQuery(SolrCore.GENOME, queryComplete);

        Map resp = jsonReader.readValue(apiResponse);
        Map completeFacets = (Map) ((Map) ((Map) resp.get("facet_counts")).get("facet_ranges"))
                .get("completion_date");

        LOGGER.debug("getGenomeCount: [{}] {}", SolrCore.GENOME.getSolrCoreName(), queryWGS);

        apiResponse = dataApi.solrQuery(SolrCore.GENOME, queryWGS);

        resp = jsonReader.readValue(apiResponse);
        Map wgsFacets = (Map) ((Map) ((Map) resp.get("facet_counts")).get("facet_ranges"))
                .get("completion_date");

        int countComplete = (Integer) completeFacets.get("before");
        int countWGS = (Integer) wgsFacets.get("before");

        Map<String, Integer> mapCountComplete = new HashMap<>();
        Map<String, Integer> mapCountWGS = new HashMap<>();

        List listComplete = (List) completeFacets.get("counts");
        for (int i = 0; i < listComplete.size(); i = i + 2) {
            countComplete = countComplete + (Integer) listComplete.get(i + 1);
            mapCountComplete.put(((String) listComplete.get(i)).substring(0, 4), countComplete);
        }
        List listWGS = (List) wgsFacets.get("counts");
        for (int i = 0; i < listWGS.size(); i = i + 2) {
            String year = ((String) listWGS.get(i)).substring(0, 4);

            countWGS = countWGS + (Integer) listWGS.get(i + 1);
            mapCountWGS.put(year, countWGS);

            JSONObject item = new JSONObject();
            item.put("year", Integer.parseInt(year));
            item.put("complete", mapCountComplete.get(year));
            item.put("wgs", mapCountWGS.get(year));
            series.add(item);
        }
    } catch (IOException e) {
        LOGGER.error(e.getMessage(), e);
    }

    JSONObject jsonData = new JSONObject();
    jsonData.put("chart_title", "Number of Bacterial Genomes");
    jsonData.put("data", series);

    return jsonData;
}

From source file:edu.vt.vbi.patric.common.DataApiHandler.java

License:Apache License

public SolrQuery buildSolrQuery(Map<String, String> key, String sorts, String facets, int start, int end,
        boolean highlight) {

    SolrQuery query = new SolrQuery();
    SolrInterface solr = new SolrInterface();

    // Processing key map
    query.setQuery(StringHelper.stripQuoteAndParseSolrKeywordOperator(key.get("keyword")));

    if (key.containsKey("filter") && key.get("filter") != null) {
        query.addFilterQuery(key.get("filter"));
    }/*from www. j  av  a  2  s .com*/
    if (key.containsKey("filter2") && key.get("filter2") != null) {
        query.addFilterQuery(key.get("filter2"));
    }

    // use SolrJoin if possible
    if (key.containsKey("join")) {
        query.addFilterQuery(key.get("join"));
    }

    if (key.containsKey("fields") && !key.get("fields").equals("")) {
        query.addField(key.get("fields"));
    }

    // sort conditions
    if (sorts != null && !sorts.equals("") && !sorts.equals("[]")) {
        try {
            JSONArray sorter = (JSONArray) new JSONParser().parse(sorts);
            for (Object aSort : sorter) {
                JSONObject jsonSort = (JSONObject) aSort;
                query.addSort(SolrQuery.SortClause.create(jsonSort.get("property").toString(),
                        jsonSort.get("direction").toString().toLowerCase()));
            }
        } catch (ParseException e) {
            LOGGER.error(e.getMessage(), e);
        }
    }

    // facet conditions
    if (facets != null && !facets.equals("") && !facets.equals("{}")) {
        query.setFacet(true).setFacetMinCount(1).setFacetLimit(-1).setFacetSort(FacetParams.FACET_SORT_COUNT)
                .set("json.nl", "map");

        try {
            JSONObject facetConditions = (JSONObject) new JSONParser().parse(facets);

            if (facetConditions.containsKey("facet.sort")) {
                String facetSort = facetConditions.get("facet.sort").toString();
                if (facetSort.equals("index")) {
                    query.setFacetSort(FacetParams.FACET_SORT_INDEX);
                }
            }

            if (facetConditions.containsKey("field_facets")) {
                String[] fieldFacets = facetConditions.get("field_facets").toString().split(",");
                query.addFacetField(fieldFacets);
            }

            if (facetConditions.containsKey("date_range_facets")
                    && !facetConditions.get("date_range_facets").equals("")) {
                String[] dateRangeFacets = facetConditions.get("date_range_facets").toString().split(",");
                for (String field : dateRangeFacets) {
                    query.addDateRangeFacet(field, solr.getRangeStartDate(), solr.getRangeEndDate(),
                            solr.getRangeDate());
                }
            }
        } catch (ParseException e) {
            LOGGER.error(e.getMessage(), e);
        }
    }

    // start & end
    query.setStart(start); // setting starting index

    if (end == -1) {
        query.setRows(MAX_ROWS);
    } else {
        query.setRows(end);
    }

    // highlight
    if (highlight) {
        query.set("hl", "on").set("hl.fl", "*");
    }

    return query;
}

From source file:edu.vt.vbi.patric.common.FacetHelper.java

License:Apache License

private static JSONObject getSingleFacetsData(DataApiHandler dataApi, SolrCore core, String keyword,
        String single_facet, String[] facets, String fq) throws IOException, ParseException {

    SolrInterface solr = new SolrInterface();

    keyword = StringHelper.stripQuoteAndParseSolrKeywordOperator(keyword);

    int beginindex = keyword.indexOf(" AND (" + single_facet);
    int endindex = 0;

    StringBuffer s = new StringBuffer(keyword);

    if (beginindex < 0) {
        beginindex = keyword.indexOf("(" + single_facet);
        endindex = keyword.indexOf(") AND ", beginindex);
        if (endindex < 0) {
            endindex = keyword.indexOf("))", beginindex);

            // TODO: this cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1
            // when Patric Libs keyword - (*) and endindex: 2
            LOGGER.debug("string:{}, beginIndex: {}, endIndex:{}", s, beginindex, endindex);
            if (endindex > 0) {
                s.delete(beginindex, endindex + 2);
            }//from   ww  w . j a  v  a  2s.c  om
        } else {
            s.delete(beginindex, endindex + 6);
        }
    } else {
        endindex = keyword.indexOf("))", beginindex);
        if (endindex == -1) {
            endindex = keyword.indexOf("])", beginindex);
        }
        s.delete(beginindex, endindex + 2);
    }
    if (s.length() == 0)
        s.append("(*)");

    SolrQuery query = new SolrQuery();
    query.setQuery(s.toString());
    if (fq != null) {
        query.setFilterQueries(fq);
    }

    query.setStart(0).setRows(1).setFacet(true).setFacetMinCount(1).set("json.nl", "map");

    for (String facet : facets) {
        if (!facet.equals("completion_date") && !facet.equals("release_date")) {
            query.addFacetField(facet);
        } else {
            query.addDateRangeFacet(facet, solr.getRangeStartDate(), solr.getRangeEndDate(),
                    solr.getRangeDate());
        }
    }

    String apiResponse = dataApi.solrQuery(core, query);

    Map resp = jsonMapReader.readValue(apiResponse);
    Map respBody = (Map) resp.get("response");

    JSONObject ret = new JSONObject();
    ret.put("response", new JSONObject(respBody));
    ret.put("facets", FacetHelper.formatFacetTree((Map) resp.get("facet_counts")));

    return ret;
}

From source file:eu.prestoprime.search.util.SolrQueryUtils.java

License:Open Source License

/**
 * Enable faceting on this solrQuery. Also sets the fields for faceting from
 * the Hashmaps key. If this is already a subsequent query you have to put
 * the selected facetValues to the appropriate value fields of the Hashmap
 * //from   w  w w. jav a 2s.  com
 * @param solrQuery
 *            solrQuery object
 * @param facets
 *            a HashMap containing facetFields and values as key and value
 *            respectively
 */
public static void setFacets(SolrQuery solrQuery, Map<P4FacetField, String> facets) {
    solrQuery.setFacet(true).setFacetLimit(10).setFacetMinCount(2);

    if (facets == null)
        facets = getDefaultFacetMap();

    for (Entry<P4FacetField, String> facet : facets.entrySet()) {
        // enable faceting on this field
        if (facet.getKey().getAssocField().getType().equals(Schema.FieldType.TDATE)) {
            // rangefacet on all fields of type tdate
            solrQuery.addDateRangeFacet(facet.getKey().getFieldName(), new Date(0), new Date(),
                    SearchConstants.getString("dateRangeFacetGranularity"));
            LOGGER.debug("Enable range faceting on field '" + facet.getKey().getFieldName() + "'");
        } else {
            solrQuery.addFacetField(facet.getKey().getFieldName());
            LOGGER.debug("Enable faceting on field '" + facet.getKey().getFieldName() + "'");
        }

        // if there is already a value for filtering on this facet then add
        // a filterquery for this
        if (facet.getValue() != null && facet.getValue().length() > 0) {
            LOGGER.debug("Set facet value '" + facet.getValue() + "' for field '"
                    + facet.getKey().getFieldName() + "'");
            solrQuery.addFilterQuery(facet.getKey().getFieldName() + ":" + facet.getValue());
        }
    }
}

From source file:org.hippoecm.hst.demo.components.SolrFaceting.java

License:Apache License

@Override
public void doBeforeRender(final HstRequest request, final HstResponse response) throws HstComponentException {

    HippoSolrClient solrClient = HstServices.getComponentManager().getComponent(HippoSolrClient.class.getName(),
            SOLR_MODULE_NAME);/*from   w  w w.j  a  v  a 2  s .co  m*/
    SolrSearchParams params = new SolrSearchParams(request);

    params.setParamsOnRequestAttr();
    try {
        // set the free text query
        HippoQuery hippoQuery = solrClient.createQuery(params.getQuery());

        SolrQuery solrQuery = hippoQuery.getSolrQuery();

        String facetPath = request.getRequestContext().getResolvedSiteMapItem().getParameter("facetpath");
        if (facetPath != null) {
            // there is a facet path : Account for the constraints
            // the facet path looks like key/value/key/value 

            String[] constraints = facetPath.split("/");
            if (constraints.length % 2 != 0) {
                log.warn("Invalid constraints because not equal number of keys and values");
            } else {
                int i = 0;
                while (i < constraints.length) {
                    String facetField = constraints[i];
                    String facetValue = constraints[i + 1];
                    solrQuery.addFilterQuery(facetField + ":" + solrClient.getQueryParser().escape(facetValue));
                    i += 2;
                }
            }
        }

        // set rows to 0 : we are not interested to get results, but to get faceted navigation
        solrQuery.setRows(0);
        solrQuery.addFacetField("brand", "categories", "title");
        solrQuery.setFacetLimit(10);

        Calendar startCal = Calendar.getInstance();
        startCal.add(Calendar.YEAR, -5);

        Date startDate = startCal.getTime();
        Date endDate = Calendar.getInstance().getTime();
        solrQuery.addDateRangeFacet("date", startDate, endDate, "+1YEAR");

        // From SOLR 3.6 and higher you can also use :
        // solrQuery.addDateRangeFacet("date", startDate , endDate, "+1YEAR, +1MONTH, +1DAY");
        // This way you can create multiple buckets for 1 date field

        final HippoQueryResult result = hippoQuery.execute();

        // we do not need to bind the beans with their providers for faceting, so no need for
        // result.bindHits()

        request.setAttribute("queryResponse", result.getQueryResponse());
        request.setAttribute("query", params.getQuery());

    } catch (SolrServerException e) {
        throw new HstComponentException(e);
    }

}