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

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

Introduction

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

Prototype

public boolean removeFilterQuery(String fq) 

Source Link

Usage

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;
}