List of usage examples for org.apache.solr.client.solrj SolrQuery setFacet
public SolrQuery setFacet(boolean b)
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
/** * Helper method to create SolrQuery object and add facet settings * * @return solrQuery the SolrQuery/* w w w.ja v a 2s . c om*/ */ protected SolrQuery initSolrQuery(SearchRequestParams searchParams, boolean substituteDefaultFacetOrder, Map<String, String[]> extraSolrParams) { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQueryType("standard"); boolean rangeAdded = false; // Facets solrQuery.setFacet(searchParams.getFacet()); if (searchParams.getFacet()) { for (String facet : searchParams.getFacets()) { if (facet.equals("date") || facet.equals("decade")) { String fname = facet.equals("decade") ? OCCURRENCE_YEAR_INDEX_FIELD : "occurrence_" + facet; initDecadeBasedFacet(solrQuery, fname); } else if (facet.equals("uncertainty")) { Map<String, String> rangeMap = rangeBasedFacets.getRangeMap("uncertainty"); for (String range : rangeMap.keySet()) { solrQuery.add("facet.query", range); } } else if (facet.endsWith(RANGE_SUFFIX)) { //this facte need to have it ranges included. if (!rangeAdded) { solrQuery.add("facet.range.other", "before"); solrQuery.add("facet.range.other", "after"); } String field = facet.replaceAll(RANGE_SUFFIX, ""); StatsIndexFieldDTO details = getRangeFieldDetails(field); if (details != null) { solrQuery.addNumericRangeFacet(field, details.getStart(), details.getEnd(), details.getGap()); } } else { solrQuery.addFacetField(facet); if ("".equals(searchParams.getFsort()) && substituteDefaultFacetOrder && FacetThemes.getFacetsMap().containsKey(facet)) { //now check if the sort order is different to supplied String thisSort = FacetThemes.getFacetsMap().get(facet).getSort(); if (!searchParams.getFsort().equalsIgnoreCase(thisSort)) solrQuery.add("f." + facet + ".facet.sort", thisSort); } } } solrQuery.setFacetMinCount(1); solrQuery.setFacetLimit(searchParams.getFlimit()); //include this so that the default fsort is still obeyed. String fsort = "".equals(searchParams.getFsort()) ? "count" : searchParams.getFsort(); solrQuery.setFacetSort(fsort); if (searchParams.getFoffset() > 0) solrQuery.add("facet.offset", Integer.toString(searchParams.getFoffset())); if (StringUtils.isNotEmpty(searchParams.getFprefix())) solrQuery.add("facet.prefix", searchParams.getFprefix()); } solrQuery.setRows(10); solrQuery.setStart(0); if (searchParams.getFl().length() > 0) { solrQuery.setFields(searchParams.getFl()); } //add the extra SOLR params if (extraSolrParams != null) { //automatically include the before and after params... if (!rangeAdded) { solrQuery.add("facet.range.other", "before"); solrQuery.add("facet.range.other", "after"); } for (String key : extraSolrParams.keySet()) { String[] values = extraSolrParams.get(key); solrQuery.add(key, values); } } return solrQuery; }
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
/** * Get a distinct list of species and their counts using a facet search * * @param queryString//from w w w. j a v a 2 s . c o m * @param pageSize * @param sortField * @param sortDirection * @return * @throws SolrServerException */ protected List<TaxaCountDTO> getSpeciesCounts(String queryString, List<String> filterQueries, List<String> facetFields, Integer pageSize, Integer startIndex, String sortField, String sortDirection) throws SolrServerException { List<TaxaCountDTO> speciesCounts = new ArrayList<TaxaCountDTO>(); SolrQuery solrQuery = new SolrQuery(); solrQuery.setQueryType("standard"); solrQuery.setQuery(queryString); if (filterQueries != null && filterQueries.size() > 0) { //solrQuery.addFilterQuery("(" + StringUtils.join(filterQueries, " OR ") + ")"); for (String fq : filterQueries) { solrQuery.addFilterQuery(fq); } } solrQuery.setRows(0); solrQuery.setFacet(true); solrQuery.setFacetSort(sortField); for (String facet : facetFields) { solrQuery.addFacetField(facet); if (logger.isDebugEnabled()) { logger.debug("adding facetField: " + facet); } } //set the facet starting point based on the paging information solrQuery.setFacetMinCount(1); solrQuery.setFacetLimit(pageSize); // unlimited = -1 | pageSize solrQuery.add("facet.offset", Integer.toString(startIndex)); if (logger.isDebugEnabled()) { logger.debug("getSpeciesCount query :" + solrQuery.getQuery()); } QueryResponse qr = runSolrQuery(solrQuery, null, 1, 0, "score", sortDirection); if (logger.isInfoEnabled()) { logger.info("SOLR query: " + solrQuery.getQuery() + "; total hits: " + qr.getResults().getNumFound()); } List<FacetField> facets = qr.getFacetFields(); java.util.regex.Pattern p = java.util.regex.Pattern.compile("\\|"); if (facets != null && facets.size() > 0) { if (logger.isDebugEnabled()) { logger.debug("Facets: " + facets.size() + "; facet #1: " + facets.get(0).getName()); } for (FacetField facet : facets) { List<FacetField.Count> facetEntries = facet.getValues(); if ((facetEntries != null) && (facetEntries.size() > 0)) { for (FacetField.Count fcount : facetEntries) { TaxaCountDTO tcDTO = null; String name = fcount.getName() != null ? fcount.getName() : ""; if (fcount.getFacetField().getName().equals(NAMES_AND_LSID)) { String[] values = p.split(name, 5); if (values.length >= 5) { if (!"||||".equals(name)) { tcDTO = new TaxaCountDTO(values[0], fcount.getCount()); tcDTO.setGuid(StringUtils.trimToNull(values[1])); tcDTO.setCommonName(values[2]); tcDTO.setKingdom(values[3]); tcDTO.setFamily(values[4]); if (StringUtils.isNotEmpty(tcDTO.getGuid())) tcDTO.setRank(searchUtils.getTaxonSearch(tcDTO.getGuid())[1].split(":")[0]); } } else { if (logger.isDebugEnabled()) { logger.debug("The values length: " + values.length + " :" + name); } tcDTO = new TaxaCountDTO(name, fcount.getCount()); } //speciesCounts.add(i, tcDTO); if (tcDTO != null && tcDTO.getCount() > 0) speciesCounts.add(tcDTO); } else if (fcount.getFacetField().getName().equals(COMMON_NAME_AND_LSID)) { String[] values = p.split(name, 6); if (values.length >= 5) { if (!"|||||".equals(name)) { tcDTO = new TaxaCountDTO(values[1], fcount.getCount()); tcDTO.setGuid(StringUtils.trimToNull(values[2])); tcDTO.setCommonName(values[0]); //cater for the bug of extra vernacular name in the result tcDTO.setKingdom(values[values.length - 2]); tcDTO.setFamily(values[values.length - 1]); if (StringUtils.isNotEmpty(tcDTO.getGuid())) tcDTO.setRank(searchUtils.getTaxonSearch(tcDTO.getGuid())[1].split(":")[0]); } } else { if (logger.isDebugEnabled()) { logger.debug("The values length: " + values.length + " :" + name); } tcDTO = new TaxaCountDTO(name, fcount.getCount()); } //speciesCounts.add(i, tcDTO); if (tcDTO != null && tcDTO.getCount() > 0) { speciesCounts.add(tcDTO); } } } } } } return speciesCounts; }
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
/** * Obtains a list and facet count of the source uids for the supplied query. * * @param searchParams/*from w ww . jav a2 s. com*/ * @return * @throws Exception */ public Map<String, Integer> getSourcesForQuery(SpatialSearchRequestParams searchParams) throws Exception { Map<String, Integer> uidStats = new HashMap<String, Integer>(); SolrQuery solrQuery = new SolrQuery(); queryFormatUtils.formatSearchQuery(searchParams); if (logger.isInfoEnabled()) { logger.info("The query : " + searchParams.getFormattedQuery()); } solrQuery.setQuery(searchParams.getFormattedQuery()); solrQuery.setQueryType("standard"); solrQuery.setRows(0); solrQuery.setFacet(true); solrQuery.setFacetMinCount(1); solrQuery.addFacetField("data_provider_uid"); solrQuery.addFacetField("data_resource_uid"); solrQuery.addFacetField("collection_uid"); solrQuery.addFacetField("institution_uid"); QueryResponse qr = runSolrQuery(solrQuery, searchParams.getFormattedFq(), 1, 0, "score", "asc"); //now cycle through and get all the facets List<FacetField> facets = qr.getFacetFields(); for (FacetField facet : facets) { if (facet.getValues() != null) { for (FacetField.Count ffc : facet.getValues()) { if (ffc.getCount() > 0) { uidStats.put(ffc.getName() != null ? ffc.getName() : "", new Integer((int) ffc.getCount())); } } } } return uidStats; }
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
/** * @see au.org.ala.biocache.dao.SearchDAO#findByFulltext(SpatialSearchRequestParams) *//*w ww . jav a2 s . c o m*/ @Override public SolrDocumentList findByFulltext(SpatialSearchRequestParams searchParams) throws Exception { SolrDocumentList sdl = null; try { queryFormatUtils.formatSearchQuery(searchParams); String queryString = searchParams.getFormattedQuery(); SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery(queryString); solrQuery.setFields(searchParams.getFl()); solrQuery.setFacet(false); solrQuery.setRows(searchParams.getPageSize()); sdl = runSolrQuery(solrQuery, searchParams).getResults(); } catch (SolrServerException ex) { logger.error("Problem communicating with SOLR server. " + ex.getMessage(), ex); } return sdl; }
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
@Cacheable(cacheName = "legendCache") public List<LegendItem> getLegend(SpatialSearchRequestParams searchParams, String facetField, String[] cutpoints) throws Exception { List<LegendItem> legend = new ArrayList<LegendItem>(); queryFormatUtils.formatSearchQuery(searchParams); if (logger.isInfoEnabled()) { logger.info("search query: " + searchParams.getFormattedQuery()); }//from w w w . j ava 2 s. c o m SolrQuery solrQuery = new SolrQuery(); solrQuery.setQueryType("standard"); solrQuery.setQuery(searchParams.getFormattedQuery()); solrQuery.setRows(0); solrQuery.setFacet(true); //is facet query? if (cutpoints == null) { //special case for the decade if (DECADE_FACET_NAME.equals(facetField)) initDecadeBasedFacet(solrQuery, "occurrence_year"); else solrQuery.addFacetField(facetField); } else { solrQuery.addFacetQuery("-" + facetField + ":[* TO *]"); for (int i = 0; i < cutpoints.length; i += 2) { solrQuery.addFacetQuery(facetField + ":[" + cutpoints[i] + " TO " + cutpoints[i + 1] + "]"); } } solrQuery.setFacetMinCount(1); solrQuery.setFacetLimit(-1);//MAX_DOWNLOAD_SIZE); // unlimited = -1 solrQuery.setFacetMissing(true); QueryResponse qr = runSolrQuery(solrQuery, searchParams.getFormattedFq(), 1, 0, "score", "asc"); List<FacetField> facets = qr.getFacetFields(); if (facets != null) { for (FacetField facet : facets) { List<FacetField.Count> facetEntries = facet.getValues(); if (facet.getName().contains(facetField) && (facetEntries != null) && (facetEntries.size() > 0)) { int i = 0; for (i = 0; i < facetEntries.size(); i++) { FacetField.Count fcount = facetEntries.get(i); if (fcount.getCount() > 0) { String fq = facetField + ":\"" + fcount.getName() + "\""; if (fcount.getName() == null) { fq = "-" + facetField + ":[* TO *]"; } legend.add(new LegendItem(fcount.getName(), fcount.getCount(), fq)); } } break; } } } //check if we have query based facets Map<String, Integer> facetq = qr.getFacetQuery(); if (facetq != null && facetq.size() > 0) { for (Entry<String, Integer> es : facetq.entrySet()) { legend.add(new LegendItem(es.getKey(), es.getValue(), es.getKey())); } } //check to see if we have a date range facet List<FacetField> facetDates = qr.getFacetDates(); if (facetDates != null && !facetDates.isEmpty()) { FacetField ff = facetDates.get(0); String firstDate = null; for (FacetField.Count facetEntry : ff.getValues()) { String startDate = facetEntry.getName(); if (firstDate == null) { firstDate = startDate; } String finishDate; if (DECADE_PRE_1850_LABEL.equals(startDate)) { startDate = "*"; finishDate = firstDate; } else { int startYear = Integer.parseInt(startDate.substring(0, 4)); finishDate = (startYear - 1) + "-12-31T23:59:59Z"; } legend.add(new LegendItem(facetEntry.getName(), facetEntry.getCount(), "occurrence_year:[" + startDate + " TO " + finishDate + "]")); } } return legend; }
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
public FacetField getFacet(SpatialSearchRequestParams searchParams, String facet) throws Exception { queryFormatUtils.formatSearchQuery(searchParams); if (logger.isInfoEnabled()) { logger.info("search query: " + searchParams.getFormattedQuery()); }// www .j a v a 2 s . co m SolrQuery solrQuery = new SolrQuery(); solrQuery.setQueryType("standard"); solrQuery.setQuery(searchParams.getFormattedQuery()); solrQuery.setRows(0); solrQuery.setFacet(true); solrQuery.addFacetField(facet); solrQuery.setFacetMinCount(1); solrQuery.setFacetLimit(-1); //MAX_DOWNLOAD_SIZE); // unlimited = -1 QueryResponse qr = runSolrQuery(solrQuery, searchParams.getFormattedFq(), 1, 0, "score", "asc"); return qr.getFacetFields().get(0); }
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
public Map<String, Integer> getOccurrenceCountsForTaxa(List<String> taxa) throws Exception { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQueryType("standard"); solrQuery.setRows(0);// w w w . j a v a 2 s . c o m solrQuery.setFacet(true); solrQuery.setFacetLimit(taxa.size()); StringBuilder sb = new StringBuilder(); Map<String, Integer> counts = new HashMap<String, Integer>(); Map<String, String> lftToGuid = new HashMap<String, String>(); for (String lsid : taxa) { //get the lft and rgt value for the taxon String[] values = searchUtils.getTaxonSearch(lsid); //first value is the search string if (sb.length() > 0) sb.append(" OR "); sb.append(values[0]); lftToGuid.put(values[0], lsid); //add the query part as a facet solrQuery.add("facet.query", values[0]); } solrQuery.setQuery(sb.toString()); //solrQuery.add("facet.query", "confidence:" + os.getRange()); QueryResponse qr = runSolrQuery(solrQuery, null, 1, 0, "score", "asc"); Map<String, Integer> facetQueries = qr.getFacetQuery(); for (String facet : facetQueries.keySet()) { //add all the counts based on the query value that was substituted String lsid = lftToGuid.get(facet); Integer count = facetQueries.get(facet); if (lsid != null && count != null) counts.put(lsid, count); } if (logger.isDebugEnabled()) { logger.debug(facetQueries); } return counts; }
From source file:au.org.ala.biocache.dao.SearchDAOImpl.java
License:Open Source License
/** * Get SOLR max boolean clauses.//from w w w . j a va2 s. c o m * * @return */ public int getMaxBooleanClauses() { if (maxBooleanClauses == 0) { SolrQuery solrQuery = new SolrQuery(); solrQuery.setFacet(false); solrQuery.setRows(0); int value = 1024; boolean ok = false; int step = -1; while (step != 0 || ok == false) { String q = 1 + StringUtils.repeat(" AND 1", value - 1); solrQuery.setQuery(q); try { query(solrQuery, queryMethod); //throws exception when too many boolean clauses if (step == -1) value *= 2; //push upper limit else step /= 2; ok = true; } catch (Exception e) { if (step == -1) step = value / 2; //set initial step value else if (ok == false && step > 1) step /= 2; ok = false; } if (step != -1) { if (ok) value += step; else value -= step; } } maxBooleanClauses = value; } queryFormatUtils.setMaxBooleanClauses(maxBooleanClauses); return maxBooleanClauses; }
From source file:au.org.ala.biocache.dao.TaxonDAOImpl.java
License:Open Source License
private List<FacetField.Count> extractFacet(String queryString, String[] filterQueries, String facetName) throws Exception { SolrQuery query = new SolrQuery(queryString); query.setFacet(true); query.addFacetField(facetName);/*from w w w . j a va 2 s . co m*/ query.setRows(0); query.setFacetLimit(200000); query.setStart(0); query.setFacetMinCount(1); query.setFacetSort("index"); //query.setFacet if (filterQueries != null) { for (String fq : filterQueries) query.addFilterQuery(fq); } QueryResponse response = server.query(query); List<FacetField.Count> fc = response.getFacetField(facetName).getValues(); if (fc == null) { fc = new ArrayList<FacetField.Count>(); } return fc; }
From source file:com.doculibre.constellio.services.FacetServicesImpl.java
License:Open Source License
public static SolrQuery toSolrQuery(SimpleSearch simpleSearch, int start, int row, boolean includeSingleValueFacets, boolean notIncludedOnly, List<String> customFieldFacets, List<String> customQueryFacets, ConstellioUser user) { String solrServerName = simpleSearch.getCollectionName(); RecordCollectionServices collectionServices = ConstellioSpringUtils.getRecordCollectionServices(); RecordCollection collection = collectionServices.get(solrServerName); SolrServices solrServices = ConstellioSpringUtils.getSolrServices(); Boolean usesDisMax = solrServices.usesDisMax(collection); SolrQuery query; if (!collection.isOpenSearch()) { query = SearchServicesImpl.toSolrQuery(simpleSearch, usesDisMax, true, includeSingleValueFacets, notIncludedOnly);// w ww . ja v a 2 s. c om } else { query = SearchServicesImpl.toSolrQuery(simpleSearch, usesDisMax, false, true, false); } query.setParam(ConstellioSolrQueryParams.COLLECTION_NAME, simpleSearch.getCollectionName()); query.setParam(ConstellioSolrQueryParams.LUCENE_QUERY, simpleSearch.getLuceneQuery(includeSingleValueFacets, true)); query.setParam(ConstellioSolrQueryParams.SIMPLE_SEARCH, simpleSearch.toSimpleParams().toString()); if (user != null) { query.setParam(ConstellioSolrQueryParams.USER_ID, "" + user.getId()); } if (StringUtils.isEmpty(query.getQuery())) { query.setQuery(SimpleSearch.SEARCH_ALL); query.setRequestHandler("/elevate"); } query.set("shards.qt", "/elevate"); query.setRequestHandler("/elevate"); query.setRows(row); query.setStart(start); query.setHighlight(true); query.setHighlightFragsize(100); query.setHighlightSnippets(2); query.setFacet(true); query.setFacetLimit(400); query.setFacetMinCount(1); if (collection.isOpenSearch()) { query.setParam("openSearchURL", collection.getOpenSearchURL()); Locale locale = simpleSearch.getSingleSearchLocale(); if (locale != null) { query.setParam("lang", locale.getLanguage()); } } else { for (CollectionFacet collectionFacet : collection.getCollectionFacets()) { if (customFieldFacets == null && collectionFacet.isFieldFacet()) { IndexField indexField = collectionFacet.getFacetField(); String indexFieldName = indexField.getName(); if (!notIncludedOnly) { query.addFacetField(indexFieldName); } else { SearchedFacet searchedFacet = simpleSearch.getSearchedFacet(indexFieldName); if (searchedFacet != null) { if (!searchedFacet.getIncludedValues().isEmpty()) { StringBuffer sbEx = new StringBuffer(); sbEx.append("{!ex=dt}"); // sbEx.append("{!ex="); // boolean first = true; // for (String includedValue : searchedFacet.getIncludedValues()) { // if (first) { // first = false; // } else { // sbEx.append(","); // } // sbEx.append(includedValue); // } // sbEx.append("}"); // query.setParam("facet.field", sbEx.toString() + indexFieldName); query.addFacetField(sbEx.toString() + indexFieldName); } else { query.addFacetField(indexFieldName); } } } } else if (customQueryFacets == null && collectionFacet.isQueryFacet()) { // Modification Rida, remplacement de collectionFacet.getLabels() par // collectionFacet.getLabelledValues() // for (I18NLabel valueLabels : collectionFacet.getLabels()) { for (I18NLabel valueLabels : collectionFacet.getLabelledValues()) { String facetQuery = valueLabels.getKey(); query.addFacetQuery(facetQuery); } } } if (customFieldFacets != null) { for (String facetField : customFieldFacets) { if (!notIncludedOnly) { query.addFacetField(facetField); } else { StringBuffer sbEx = new StringBuffer(); sbEx.append("{!ex=dt}"); // sbEx.append("{!ex="); // boolean first = true; // for (String includedValue : searchedFacet.getIncludedValues()) { // if (first) { // first = false; // } else { // sbEx.append(","); // } // sbEx.append(includedValue); // } // sbEx.append("}"); query.setParam("facet.field", sbEx.toString() + facetField); } } } if (customQueryFacets != null) { for (String facetQuery : customQueryFacets) { query.addFacetQuery(facetQuery); } } } return query; }