List of usage examples for org.apache.solr.client.solrj SolrQuery setFacetPrefix
public SolrQuery setFacetPrefix(String field, String prefix)
From source file:edu.unc.lib.dl.search.solr.service.SolrSearchService.java
License:Apache License
/** * Attempts to retrieve the hierarchical facet from the facet field corresponding to fieldKey that matches the value * of searchValue. Retrieves and populates all tiers leading up to the tier number given in searchValue. * //from w w w . j a v a 2s.co m * @param fieldKey * Key of the facet field to search for the facet within. * @param searchValue * Value to find a matching facet for, should be formatted <tier>,<value> * @param accessGroups * @return */ public FacetFieldObject getHierarchicalFacet(AbstractHierarchicalFacet facet, AccessGroupSet accessGroups) { QueryResponse queryResponse = null; SolrQuery solrQuery = new SolrQuery(); StringBuilder query = new StringBuilder(); query.append("[* TO *]"); try { // Add access restrictions to query addAccessRestrictions(query, accessGroups); } catch (AccessRestrictionException e) { // If the user doesn't have any access groups, they don't have access to anything, return null. LOG.error(e.getMessage()); return null; } solrQuery.setQuery(query.toString()); solrQuery.setRows(0); solrQuery.setFacet(true); solrQuery.setFacetMinCount(1); String solrFieldName = solrSettings.getFieldName(facet.getFieldName()); solrQuery.addFacetField(solrFieldName); solrQuery.setFacetPrefix(solrFieldName, facet.getSearchValue()); LOG.debug("getHierarchicalFacet query: " + solrQuery.toString()); try { queryResponse = server.query(solrQuery); } catch (SolrServerException e) { LOG.error("Error retrieving Solr object request: " + e); return null; } FacetField facetField = queryResponse.getFacetField(solrFieldName); if (facetField.getValueCount() == 0) return null; return facetFieldFactory.createFacetFieldObject(facet.getFieldName(), queryResponse.getFacetField(solrFieldName)); }
From source file:edu.unc.lib.dl.search.solr.util.FacetFieldUtil.java
License:Apache License
private void addCutoffFacetValue(CutoffFacet facet, SolrQuery solrQuery) { List<HierarchicalFacetNode> facetNodes = facet.getFacetNodes(); CutoffFacetNode endNode = (CutoffFacetNode) facetNodes.get(facetNodes.size() - 1); String solrFieldName = solrSettings.getFieldName(facet.getFieldName()); StringBuilder filterQuery = new StringBuilder(); filterQuery.append(solrFieldName).append(":").append(endNode.getTier()).append(","); if (!endNode.getSearchKey().equals("*")) { filterQuery.append(SolrSettings.sanitize(endNode.getSearchKey())).append(","); }//w w w.ja v a2 s .co m filterQuery.append('*'); solrQuery.addFilterQuery(filterQuery.toString()); if (facet.getCutoff() != null) { filterQuery = new StringBuilder(); filterQuery.append('!').append(solrFieldName).append(':').append(facet.getCutoff()).append(',') .append('*'); solrQuery.addFilterQuery(filterQuery.toString()); } if (facet.getFacetCutoff() != null) { solrQuery.setFacetPrefix(solrFieldName, facet.getFacetCutoff() + ","); } }
From source file:org.dspace.discovery.SolrServiceImpl.java
License:BSD License
protected SolrQuery resolveToSolrQuery(Context context, DiscoverQuery discoveryQuery, boolean includeUnDiscoverable) { SolrQuery solrQuery = new SolrQuery(); String query = "*:*"; if (discoveryQuery.getQuery() != null) { query = discoveryQuery.getQuery(); }/* w w w . j av a 2 s .com*/ solrQuery.setQuery(query); if (discoveryQuery.isSpellCheck()) { solrQuery.setParam(SpellingParams.SPELLCHECK_Q, query); solrQuery.setParam(SpellingParams.SPELLCHECK_COLLATE, Boolean.TRUE); solrQuery.setParam("spellcheck", Boolean.TRUE); } if (!includeUnDiscoverable) { solrQuery.addFilterQuery("NOT(withdrawn:true)"); solrQuery.addFilterQuery("NOT(discoverable:false)"); } for (int i = 0; i < discoveryQuery.getFilterQueries().size(); i++) { String filterQuery = discoveryQuery.getFilterQueries().get(i); solrQuery.addFilterQuery(filterQuery); } if (discoveryQuery.getDSpaceObjectFilter() != -1) { solrQuery.addFilterQuery("search.resourcetype:" + discoveryQuery.getDSpaceObjectFilter()); } for (int i = 0; i < discoveryQuery.getFieldPresentQueries().size(); i++) { String filterQuery = discoveryQuery.getFieldPresentQueries().get(i); solrQuery.addFilterQuery(filterQuery + ":[* TO *]"); } if (discoveryQuery.getStart() != -1) { solrQuery.setStart(discoveryQuery.getStart()); } if (discoveryQuery.getMaxResults() != -1) { solrQuery.setRows(discoveryQuery.getMaxResults()); } if (discoveryQuery.getSortField() != null) { SolrQuery.ORDER order = SolrQuery.ORDER.asc; if (discoveryQuery.getSortOrder().equals(DiscoverQuery.SORT_ORDER.desc)) order = SolrQuery.ORDER.desc; solrQuery.addSortField(discoveryQuery.getSortField(), order); } for (String property : discoveryQuery.getProperties().keySet()) { List<String> values = discoveryQuery.getProperties().get(property); solrQuery.add(property, values.toArray(new String[values.size()])); } List<DiscoverFacetField> facetFields = discoveryQuery.getFacetFields(); if (0 < facetFields.size()) { //Only add facet information if there are any facets for (DiscoverFacetField facetFieldConfig : facetFields) { String field = transformFacetField(facetFieldConfig, facetFieldConfig.getField(), false); solrQuery.addFacetField(field); // Setting the facet limit in this fashion ensures that each facet can have its own max solrQuery.add("f." + field + "." + FacetParams.FACET_LIMIT, String.valueOf(facetFieldConfig.getLimit())); String facetSort; if (DiscoveryConfigurationParameters.SORT.COUNT.equals(facetFieldConfig.getSortOrder())) { facetSort = FacetParams.FACET_SORT_COUNT; } else { facetSort = FacetParams.FACET_SORT_INDEX; } solrQuery.add("f." + field + "." + FacetParams.FACET_SORT, facetSort); if (facetFieldConfig.getOffset() != -1) { solrQuery.setParam("f." + field + "." + FacetParams.FACET_OFFSET, String.valueOf(facetFieldConfig.getOffset())); } if (facetFieldConfig.getPrefix() != null) { solrQuery.setFacetPrefix(field, facetFieldConfig.getPrefix()); } } List<String> facetQueries = discoveryQuery.getFacetQueries(); for (String facetQuery : facetQueries) { solrQuery.addFacetQuery(facetQuery); } if (discoveryQuery.getFacetMinCount() != -1) { solrQuery.setFacetMinCount(discoveryQuery.getFacetMinCount()); } solrQuery.setParam(FacetParams.FACET_OFFSET, String.valueOf(discoveryQuery.getFacetOffset())); } if (0 < discoveryQuery.getHitHighlightingFields().size()) { solrQuery.setHighlight(true); solrQuery.add(HighlightParams.USE_PHRASE_HIGHLIGHTER, Boolean.TRUE.toString()); for (DiscoverHitHighlightingField highlightingField : discoveryQuery.getHitHighlightingFields()) { solrQuery.addHighlightField(highlightingField.getField() + "_hl"); solrQuery.add("f." + highlightingField.getField() + "_hl." + HighlightParams.FRAGSIZE, String.valueOf(highlightingField.getMaxChars())); solrQuery.add("f." + highlightingField.getField() + "_hl." + HighlightParams.SNIPPETS, String.valueOf(highlightingField.getMaxSnippets())); } } //Add any configured search plugins ! List<SolrServiceSearchPlugin> solrServiceSearchPlugins = new DSpace().getServiceManager() .getServicesByType(SolrServiceSearchPlugin.class); for (SolrServiceSearchPlugin searchPlugin : solrServiceSearchPlugins) { searchPlugin.additionalSearchParameters(context, discoveryQuery, solrQuery); } return solrQuery; }
From source file:org.opencommercesearch.AbstractSearchServer.java
License:Apache License
@Override public SearchResponse browse(BrowseOptions options, SolrQuery query, Site site, Locale locale, FilterQuery... filterQueries) throws SearchServerException { boolean hasCategoryId = StringUtils.isNotBlank(options.getCategoryId()); boolean hasCategoryPath = StringUtils.isNotBlank(options.getCategoryPath()); boolean hasBrandId = StringUtils.isNotBlank(options.getBrandId()); boolean addCategoryGraph = (options.isFetchCategoryGraph() || (hasBrandId && options.isFetchProducts() && !hasCategoryId)) && !options.isRuleBasedPage(); String categoryPath = null;/*from www.j ava 2 s. co m*/ if (hasCategoryPath) { categoryPath = options.getCategoryPath(); } else { categoryPath = options.getCatalogId() + "."; } if (options.isRuleBasedPage()) { //handle rule based pages String filter = rulesBuilder.buildRulesFilter(options.getCategoryId(), locale); query.addFilterQuery(filter); query.setParam("q", "*:*"); } else { //handle brand, category or onsale pages if (addCategoryGraph) { query.setFacetPrefix(CATEGORY_PATH, categoryPath); query.addFacetField(CATEGORY_PATH); query.set("f.categoryPath.facet.limit", options.getMaxCategoryResults()); } if (!options.isFetchProducts()) { query.setRows(0); } List<String> queryAltParams = new ArrayList<String>(); if (hasCategoryId) { queryAltParams.add(CATEGORY_PATH + ":" + categoryPath); query.setParam("q", ""); } if (hasBrandId) { queryAltParams.add(BRAND_ID + ":" + options.getBrandId()); query.setParam("q", ""); } if (options.isOnSale()) { queryAltParams.add("onsale" + locale.getCountry() + ":true"); } if (queryAltParams.size() > 0) { query.set(Q_ALT, "(" + StringUtils.join(queryAltParams, " AND ") + ")"); } } RepositoryItem catalog = null; if (site != null) { catalog = (RepositoryItem) site.getPropertyValue("defaultCatalog"); } SearchResponse response = null; if (options.isRuleBasedPage()) { response = doSearch(query, site, catalog, locale, false, true, categoryPath, options.isOnSale(), options.getBrandId(), filterQueries); } else if (hasCategoryPath) { response = doSearch(query, site, catalog, locale, false, false, categoryPath, options.isOnSale(), options.getBrandId(), filterQueries); } else { response = doSearch(query, site, catalog, locale, false, false, null, options.isOnSale(), options.getBrandId(), filterQueries); } if (addCategoryGraph) { response.setCategoryGraph( createCategoryGraph(response, options.getCategoryPath(), options.getCatalogId(), options.getCategoryId(), options.getDepthLimit(), options.getSeparator())); } return response; }
From source file:org.opencommercesearch.AbstractSearchServer.java
License:Apache License
@Override public Facet getFacet(Site site, Locale locale, String fieldFacet, int facetLimit, int depthLimit, String separator, FilterQuery... filterQueries) throws SearchServerException { try {/* w w w.java 2s. c o m*/ SolrQuery query = new SolrQuery(); query.setRows(0); query.setQuery("*:*"); query.addFacetField(fieldFacet); query.setFacetLimit(facetLimit); query.setFacetMinCount(1); query.addFilterQuery("country:" + locale.getCountry()); RepositoryItem catalog = (RepositoryItem) site.getPropertyValue("defaultCatalog"); String catalogId = catalog.getRepositoryId(); query.setFacetPrefix(CATEGORY_PATH, catalogId + "."); query.addFilterQuery(CATEGORY_PATH + ":" + catalogId); if (filterQueries != null) { for (FilterQuery filterQuery : filterQueries) { query.addFilterQuery(filterQuery.toString()); } } QueryResponse queryResponse = getCatalogSolrServer(locale).query(query); Facet facet = null; if (queryResponse != null && queryResponse.getFacetFields() != null) { FacetField facetField = queryResponse.getFacetField(fieldFacet); if (facetField != null) { List<Count> values = facetField.getValues(); if (values != null && !values.isEmpty()) { facet = new Facet(); facet.setName(StringUtils.capitalize(fieldFacet)); List<Filter> filters = new ArrayList<Facet.Filter>(); boolean filterByDepth = depthLimit > 0 && StringUtils.isNotBlank(separator); for (Count count : values) { if (filterByDepth && StringUtils.countMatches(count.getName(), separator) > depthLimit) { continue; } Filter filter = new Filter(); filter.setName(count.getName()); filter.setCount(count.getCount()); filter.setFilterQuery(count.getAsFilterQuery()); filter.setFilterQueries(count.getAsFilterQuery()); filters.add(filter); } facet.setFilters(filters); } } } return facet; } catch (SolrServerException ex) { throw create(SEARCH_EXCEPTION, ex); } catch (SolrException ex) { throw create(SEARCH_EXCEPTION, ex); } }
From source file:org.opencommercesearch.RuleManager.java
License:Apache License
void setFilterQueries(FilterQuery[] filterQueries, String catalogId, SolrQuery query) { query.setFacetPrefix("category", "1." + catalogId + "."); query.addFilterQuery("category:" + "0." + catalogId); if (filterQueries == null) { return;/* w w w.ja va 2s . com*/ } Map<String, Set<String>> multiExpressionFilters = new HashMap<String, Set<String>>(); for (FilterQuery filterQuery : filterQueries) { if (filterQuery.getFieldName().equals("category")) { String category = filterQuery.getExpression(); int index = category.indexOf(SearchConstants.CATEGORY_SEPARATOR); if (index != -1) { int level = Integer.parseInt(category.substring(0, index)); category = ++level + FilterQuery.unescapeQueryChars(category.substring(index)) + "."; query.setFacetPrefix("category", category); } } RepositoryItem facetItem = getFacetManager().getFacetItem(filterQuery.getFieldName()); if (facetItem != null) { Boolean isMultiSelect = (Boolean) facetItem.getPropertyValue(FacetProperty.IS_MULTI_SELECT); if (isMultiSelect != null && isMultiSelect) { //query.addFilterQuery( + + + filterQuery); Set<String> expressions = multiExpressionFilters.get(filterQuery.getFieldName()); if (expressions == null) { expressions = new HashSet<String>(); multiExpressionFilters.put(filterQuery.getFieldName(), expressions); } expressions.add(filterQuery.getExpression()); continue; } } query.addFilterQuery(filterQuery.toString()); } StringBuilder b = new StringBuilder(); for (Entry<String, Set<String>> entry : multiExpressionFilters.entrySet()) { String operator = " OR "; String fieldName = entry.getKey(); b.append("{!tag=").append(fieldName).append("}"); for (String expression : entry.getValue()) { b.append(fieldName).append(FilterQuery.SEPARATOR).append(expression).append(operator); } b.setLength(b.length() - operator.length()); query.addFilterQuery(b.toString()); b.setLength(0); } }
From source file:org.zaizi.sensefy.api.service.SolrSmartAutoCompleteService.java
License:Open Source License
/** * <p>// ww w.j a va2 s. c om * Suggestions from Facet Prefix * </p> * * @param attributesQuery * @param termToComplete * @param numberOfSuggestions * @param suggestionField * @param solrCore * @return * @throws SolrServerException */ private List<String> suggestionsFromFacetPrefix(SolrQuery attributesQuery, String termToComplete, int numberOfSuggestions, String suggestionField, SolrServer solrCore) throws SolrServerException, IOException { List<String> suggestions = new ArrayList<String>(); attributesQuery.setRows(0); attributesQuery.setFacet(true); attributesQuery.addFacetField(suggestionField); attributesQuery.setFacetMinCount(1); attributesQuery.setFacetLimit(numberOfSuggestions); // if ( termToComplete != null && !termToComplete.isEmpty() ) attributesQuery.setFacetPrefix(suggestionField, termToComplete); QueryResponse attributesQueryResponse; attributesQueryResponse = solrCore.query(attributesQuery); FacetField facetField = attributesQueryResponse.getFacetField(suggestionField); List<FacetField.Count> facets = facetField.getValues(); for (FacetField.Count singleFacet : facets) { suggestions.add(singleFacet.getName()); } return suggestions; }