List of usage examples for org.apache.solr.client.solrj SolrQuery removeFilterQuery
public boolean removeFilterQuery(String fq)
From source file:edu.unc.lib.dl.ui.service.SolrQueryLayerService.java
License:Apache License
private void executeChildrenCounts(StringBuilder query, List<BriefObjectMetadata> containerObjects, SolrQuery solrQuery, String countName, Integer tier) { String ancestorPathField = solrSettings.getFieldName(SearchFieldKeys.ANCESTOR_PATH.name()); // Remove all ancestor path related filter queries or filter queries from previous count executions, so the counts // won't be cut off if (solrQuery.getFilterQueries() != null) { for (String filterQuery : solrQuery.getFilterQueries()) { if (filterQuery.contains(ancestorPathField)) { solrQuery.removeFilterQuery(filterQuery); }/*from w ww. jav a 2 s .c om*/ } } if (tier != null) { solrQuery.remove("f." + ancestorPathField + ".facet.prefix"); solrQuery.add("f." + ancestorPathField + ".facet.prefix", tier + ","); } solrQuery.addFilterQuery(query.toString()); try { long startTime = System.currentTimeMillis(); QueryResponse queryResponse = this.executeQuery(solrQuery); LOG.info("Query executed in " + (System.currentTimeMillis() - startTime)); assignChildrenCounts(queryResponse.getFacetField(ancestorPathField), containerObjects, countName); } catch (SolrServerException e) { LOG.error("Error retrieving Solr search result request", e); } }
From source file:org.ambraproject.search.service.SolrSearchService.java
License:Apache License
/** * Populate facets of the search object. * * If no search results and hence facets are found remove defined filters and try * the search again. Journals and ArticleType facets will always be the complete list. * //from w w w. j ava 2 s . c om * * @param searchParameters The search parameters * @return a populared SearchResultSinglePage object * @throws ApplicationException */ public SearchResultSinglePage getFilterData(SearchParameters searchParameters) throws ApplicationException { //TODO: This function queries SOLR for the journal and article type list //We should migrate this away from config and into a database when it is //available //Does not impact unformattedQuery field. SearchParameters sp = cleanStrings(searchParameters); String q = searchParameters.getUnformattedQuery().trim(); //In this use case, if the query string is empty, we want to get facets for everything if (q.length() == 0) { q = "*:*"; } if (log.isDebugEnabled()) { log.debug("Solr Search performed to get facet data on the unformattedSearch String: " + q); } //We want a complete set of facet data. So first, lets get it all SolrQuery query = createQuery("*:*", 0, 0, false); //Remove facets we don't use in this case query.removeFacetField("author_facet"); query.removeFacetField("editor_facet"); query.removeFacetField("affiliate_facet"); //Add the one we do want in this case. query.addFacetField("cross_published_journal_key"); query.setFacetLimit(MAX_FACET_SIZE); //Related to JO: http://joborder.plos.org/view.php?id=17480 //(for now) we don't want to search on Issue Images query.addFilterQuery(createFilterNoIssueImageDocuments()); SearchResultSinglePage preFilterResults = search(query); setFilters(query, sp, true); query.setQuery(q); SearchResultSinglePage results = null; try { results = search(query); } catch (SolrException e) { query.setQuery("*:*"); if (log.isWarnEnabled()) { log.warn("Solr Search failed on the unformattedSearch String: { " + query.getQuery() + " } so the query will be re-run using the String *:* to populate the Filters" + " on the Advanced Search page.", e); } } if (results == null || results.getTotalNoOfResults() == 0) { //If no results, remove optional filters and try again for (String filter : query.getFilterQueries()) { if (filter.indexOf(createFilterFullDocuments()) < 0) { query.removeFilterQuery(filter); } } results = search(query); //If results are STILL empty. We must return something for subjects. //So let's use the global list if (results.getTotalNoOfResults() == 0) { results.setSubjectFacet(preFilterResults.getSubjectFacet()); } results.setFiltersReset(true); } //Lets always return ALL values for journals and article types //These lists will not be dependant on the user's other //selections other then the query //However, subjects will be! results.setJournalFacet(preFilterResults.getJournalFacet()); results.setArticleTypeFacet(preFilterResults.getArticleTypeFacet()); return results; }
From source file:org.ambraproject.service.search.SolrSearchService.java
License:Apache License
/** * Populate facets of the search object. * <p/>//from w w w. ja va2s. c o m * If no search results and hence facets are found remove defined filters and try the search again. Journals will * always be the complete list. * * @param searchParameters The search parameters * @return a populared SearchResultSinglePage object * @throws ApplicationException */ public SearchResultSinglePage getFilterData(SearchParameters searchParameters) throws ApplicationException { //TODO: This function queries SOLR for the journal and article type list //We should migrate this away from config and into a database when it is //available //Does not impact unformattedQuery field. SearchParameters sp = cleanStrings(searchParameters); String q = searchParameters.getUnformattedQuery().trim(); //In this use case, if the query string is empty, we want to get facets for everything if (q.length() == 0) { q = "*:*"; } if (log.isDebugEnabled()) { log.debug("Solr Search performed to get facet data on the unformattedSearch String: " + q); } //We want a complete set of facet data. So first, lets get it all SolrQuery query = createQuery("*:*", 0, 0, false); //Remove facets we don't use in this case query.removeFacetField("author_facet"); query.removeFacetField("editor_facet"); query.removeFacetField("affiliate_facet"); //Add the one we do want in this case. query.addFacetField("cross_published_journal_key"); query.addFacetField("article_type"); query.setFacetLimit(MAX_FACET_SIZE); //Related to JO: http://joborder.plos.org/view.php?id=17480 //(for now) we don't want to search on Issue Images query.addFilterQuery(createFilterNoIssueImageDocuments()); SearchResultSinglePage preFilterResults = search(query); setFilters(query, sp, false, false); query.setQuery(q); SearchResultSinglePage results = null; try { results = search(query); } catch (SolrException e) { query.setQuery("*:*"); if (log.isWarnEnabled()) { log.warn("Solr Search failed on the unformattedSearch String: { " + query.getQuery() + " } so the query will be re-run using the String *:* to populate the Filters" + " on the Advanced Search page.", e); } } if (results == null || results.getTotalNoOfResults() == 0) { //If no results, remove optional filters and try again for (String filter : query.getFilterQueries()) { if (filter.indexOf(createFilterFullDocuments()) < 0) { query.removeFilterQuery(filter); } } results = search(query); //If results are STILL empty. We must return something for subjects and article type. //So let's use the global list if (results.getTotalNoOfResults() == 0) { results.setSubjectFacet(preFilterResults.getSubjectFacet()); results.setArticleTypeFacet(preFilterResults.getArticleTypeFacet()); } results.setFiltersReset(true); } //Lets always return ALL values for journals //These lists will not be dependant on the user's other //selections other then the query //However, subjects and article type will be! results.setJournalFacet(preFilterResults.getJournalFacet()); results.setArticleTypeFacet(preFilterResults.getArticleTypeFacet()); return results; }
From source file:org.apache.nutch.indexwriter.solr.TestSolrJ.java
License:Apache License
/** * query the example//from www .j av a 2 s. c om */ @Test public void testQuery() throws Exception { SolrClient client = new HttpSolrClient.Builder(serverUrl).build(); // Empty the database... client.deleteByQuery("*:*");// delete everything! // Now add something... SolrInputDocument doc = new SolrInputDocument(); String docID = "1112211111"; doc.addField("id", docID, 1.0f); doc.addField("name", "my name!", 1.0f); assertEquals(null, doc.getField("foo")); assertTrue(doc.getField("name").getValue() != null); UpdateResponse upres = client.add(doc); // System.out.println( "ADD:"+upres.getResponse() ); assertEquals(0, upres.getStatus()); upres = client.commit(true, true); // System.out.println( "COMMIT:"+upres.getResponse() ); assertEquals(0, upres.getStatus()); upres = client.optimize(true, true); // System.out.println( "OPTIMIZE:"+upres.getResponse() ); assertEquals(0, upres.getStatus()); SolrQuery query = new SolrQuery(); query.setQuery("id:" + docID); QueryResponse response = client.query(query); assertEquals(docID, response.getResults().get(0).getFieldValue("id")); // Now add a few docs for facet testing... List<SolrInputDocument> docs = new ArrayList<>(); SolrInputDocument doc2 = new SolrInputDocument(); doc2.addField("id", "2", 1.0f); doc2.addField("inStock", true, 1.0f); doc2.addField("price", 2, 1.0f); doc2.addField("timestamp_dt", new java.util.Date(), 1.0f); docs.add(doc2); SolrInputDocument doc3 = new SolrInputDocument(); doc3.addField("id", "3", 1.0f); doc3.addField("inStock", false, 1.0f); doc3.addField("price", 3, 1.0f); doc3.addField("timestamp_dt", new java.util.Date(), 1.0f); docs.add(doc3); SolrInputDocument doc4 = new SolrInputDocument(); doc4.addField("id", "4", 1.0f); doc4.addField("inStock", true, 1.0f); doc4.addField("price", 4, 1.0f); doc4.addField("timestamp_dt", new java.util.Date(), 1.0f); docs.add(doc4); SolrInputDocument doc5 = new SolrInputDocument(); doc5.addField("id", "5", 1.0f); doc5.addField("inStock", false, 1.0f); doc5.addField("price", 5, 1.0f); doc5.addField("timestamp_dt", new java.util.Date(), 1.0f); docs.add(doc5); upres = client.add(docs); // System.out.println( "ADD:"+upres.getResponse() ); assertEquals(0, upres.getStatus()); upres = client.commit(true, true); // System.out.println( "COMMIT:"+upres.getResponse() ); assertEquals(0, upres.getStatus()); upres = client.optimize(true, true); // System.out.println( "OPTIMIZE:"+upres.getResponse() ); assertEquals(0, upres.getStatus()); query = new SolrQuery("*:*"); query.addFacetQuery("price:[* TO 2]"); query.addFacetQuery("price:[2 TO 4]"); query.addFacetQuery("price:[5 TO *]"); query.addFacetField("inStock"); query.addFacetField("price"); query.addFacetField("timestamp_dt"); query.removeFilterQuery("inStock:true"); response = client.query(query); assertEquals(0, response.getStatus()); assertEquals(5, response.getResults().getNumFound()); assertEquals(3, response.getFacetQuery().size()); assertEquals(2, response.getFacetField("inStock").getValueCount()); assertEquals(4, response.getFacetField("price").getValueCount()); // test a second query, test making a copy of the main query SolrQuery query2 = query.getCopy(); query2.addFilterQuery("inStock:true"); response = client.query(query2); assertEquals(1, query2.getFilterQueries().length); assertEquals(0, response.getStatus()); assertEquals(2, response.getResults().getNumFound()); assertFalse(query.getFilterQueries() == query2.getFilterQueries()); // sanity check round tripping of params... query = new SolrQuery("foo"); query.addFilterQuery("{!field f=inStock}true"); query.addFilterQuery("{!term f=name}hoss"); query.addFacetQuery("price:[* TO 2]"); query.addFacetQuery("price:[2 TO 4]"); response = client.query(query); assertTrue("echoed params are not a NamedList: " + response.getResponseHeader().get("params").getClass(), response.getResponseHeader().get("params") instanceof NamedList); NamedList echo = (NamedList) response.getResponseHeader().get("params"); List values = null; assertEquals("foo", echo.get("q")); assertTrue("echoed fq is not a List: " + echo.get("fq").getClass(), echo.get("fq") instanceof List); values = (List) echo.get("fq"); assertEquals(2, values.size()); assertEquals("{!field f=inStock}true", values.get(0)); assertEquals("{!term f=name}hoss", values.get(1)); assertTrue("echoed facet.query is not a List: " + echo.get("facet.query").getClass(), echo.get("facet.query") instanceof List); values = (List) echo.get("facet.query"); assertEquals(2, values.size()); assertEquals("price:[* TO 2]", values.get(0)); assertEquals("price:[2 TO 4]", values.get(1)); }
From source file:uk.co.flax.ukmp.search.solr.SolrSearchEngine.java
License:Apache License
/** * Run the given query, removing the given list of filters from the query itself. * @param query the query to be run.//from w w w. j a v a 2s. co m * @param filters the list of filters to remove. * @return a list of documents returned from the query. * @throws SolrServerException if a problem occurs accessing Solr. */ private SolrDocumentList runQueryWithoutFilters(SolrQuery query, List<String> filters) throws SolrServerException { for (String fq : filters) { // Re-query without the filter queries set query.removeFilterQuery(fq); } QueryResponse response = server.query(query); SolrDocumentList docs = response.getResults(); // Set numFound to the results list size, avoid reading every tweet in // the search engine if (docs.getNumFound() > 0) { docs.setNumFound(docs.size()); } return docs; }
From source file:xc.mst.action.browse.BrowseRecords.java
License:Open Source License
/** * Search for records/* w w w .j ava2s.co 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; }