Changeset 8247

Show
Ignore:
Timestamp:
02/24/10 18:05:35 (5 months ago)
Author:
ssterling
Message:

For Solr Search, now remove AND and OR from incoming search Strings. Put quotes around each author name to make search results more specific.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • head/ambra/webapp/src/main/java/org/topazproject/ambra/search2/service/SolrSearchService.java

    r8240 r8247  
    2424import org.apache.solr.client.solrj.SolrQuery; 
    2525import org.apache.solr.client.solrj.SolrServerException; 
     26import org.apache.solr.client.solrj.response.FacetField; 
    2627import org.apache.solr.client.solrj.response.QueryResponse; 
    2728import org.apache.solr.common.SolrDocument; 
     
    7071   */ 
    7172  public SearchResultSinglePage simpleSearch(String queryString, String eissn, int startPage, int pageSize) throws ApplicationException { 
     73    queryString = queryString.replaceAll("AND", "").replaceAll("OR", ""); 
    7274    log.debug("Simple Search performed on the String: " + queryString 
    7375        + " startPage: " + startPage 
     
    8385 
    8486  public SearchResultSinglePage advancedSearch(SearchParameters searchParameters) throws ApplicationException { 
     87    searchParameters = cleanStrings(searchParameters); 
    8588    log.debug("Advanced Search performed on the SearchParameters: " + searchParameters); 
    8689 
     
    104107        String creatorName = searchParameters.getCreator()[i]; 
    105108        if (StringUtils.isNotBlank(creatorName)) { 
    106           q.append(" author:").append(creatorName); 
     109          q.append(" author:\"").append(creatorName).append("\""); 
    107110        } 
    108111        if (i < searchParameters.getCreator().length - 1 
     
    253256    query.setFields("doi", "score", "title", "publication_date", "eissn", "journal", "article_type", "author"); 
    254257    query.set("spellcheck", true); // Return a list of possible matches for misspelled words. 
     258    query.setFacet(true); 
     259    query.set("facet.method", "enum"); 
     260    query.addFacetField("eissn"); 
     261    query.addFacetField("subject_facet"); 
    255262    return query; 
    256263  } 
     
    343350          + ", max_score:" + documentList.getMaxScore() 
    344351          + ", QTime:" + queryResponse.getQTime() + "ms"); 
    345     } 
     352 
     353      // TODO: implement spell-checking in a meaningful manner.  This loop exists only to generate log output. 
     354      // TODO: Add "spellcheckAlternatives" or something like it to the SearchHits class so it can be displayed to the user like Google's "did you mean..." 
     355      // TODO: Turn off spellchecking for the "author" field. 
     356//      Map<String, List<String>> spellcheckAlternatives = new LinkedHashMap<String, List<String>>(); 
     357//        spellcheckAlternatives.put(token, queryResponse.getSpellCheckResponse().getSuggestionMap().get(token).getAlternatives()); 
     358      if (queryResponse != null && queryResponse.getSpellCheckResponse() != null 
     359          && queryResponse.getSpellCheckResponse().getSuggestionMap() != null 
     360          && queryResponse.getSpellCheckResponse().getSuggestionMap().keySet().size() > 0) { 
     361        StringBuilder sb = new StringBuilder("Spellcheck alternative suggestions:"); 
     362        for (String token : queryResponse.getSpellCheckResponse().getSuggestionMap().keySet()) { 
     363          sb.append(" { ").append(token).append(" : "); 
     364          if (queryResponse.getSpellCheckResponse().getSuggestionMap().get(token).getAlternatives().size() < 1) { 
     365            sb.append("NO ALTERNATIVES"); 
     366          } else { 
     367            for ( String alternative : queryResponse.getSpellCheckResponse().getSuggestionMap().get(token).getAlternatives()) { 
     368              sb.append(alternative).append(", "); 
     369            } 
     370            sb.replace(sb.length() - 2, sb.length(), ""); // Remove last comma and space. 
     371          } 
     372          sb.append(" } ,"); 
     373        } 
     374        log.info(sb.replace(sb.length() - 2, sb.length(), "").toString()); // Remove last comma and space. 
     375      } else { 
     376        log.info("Solr thinks everything in the query is spelled correctly."); 
     377      } 
     378 
     379      // TODO: Implement faceting 
     380      // TODO: Turn on these facet debug statements and reformat them in a more condensed and readable format. 
     381//      if (queryResponse.getFacetFields().size() > 0) { 
     382//        for (FacetField facetField : queryResponse.getFacetFields()) { 
     383//          log.info(" ### facetField.getName() = " + facetField.getName() + " ::: facetField.getValueCount() = " + facetField.getValueCount()); 
     384//          for (FacetField.Count count : facetField.getValues()) { 
     385//            log.info("   %%% count.getName() = " + count.getName() + " ::: count.getCount() = " + count.getCount() 
     386//                + " ::: count.getAsFilterQuery() = " + count.getAsFilterQuery()); 
     387//          } 
     388//        } 
     389//      } else { 
     390//        log.info(" ### There is no facet information for this query."); 
     391//      } 
     392    } //  end if (log.isInfoEnabled()). 
    346393 
    347394    Map<String, Map<String, List<String>>> highlightings = queryResponse.getHighlighting(); 
    348  
    349     // TODO: implement spell-checking in a menaingful manner.  This loop exists only to generate log output. 
    350     // TODO: Add "spellcheckAlternatives" or something like it to the SearchHits class so it can be displayed to the user like Google's "did you mean..." 
    351     // TODO: Turn off spellchecking for the "author" field. 
    352 //    Map<String, List<String>> spellcheckAlternatives = new LinkedHashMap<String, List<String>>(); 
    353 //      spellcheckAlternatives.put(token, queryResponse.getSpellCheckResponse().getSuggestionMap().get(token).getAlternatives()); 
    354     if (log.isInfoEnabled() && queryResponse.getSpellCheckResponse().getSuggestionMap().keySet().size() > 0) { 
    355       StringBuilder sb = new StringBuilder("Spellcheck alternative suggestions:"); 
    356       for (String token : queryResponse.getSpellCheckResponse().getSuggestionMap().keySet()) { 
    357         sb.append(" { ").append(token).append(" : "); 
    358         if (queryResponse.getSpellCheckResponse().getSuggestionMap().get(token).getAlternatives().size() < 1) { 
    359           sb.append("NO ALTERNATIVES"); 
    360         } else { 
    361           for ( String alternative : queryResponse.getSpellCheckResponse().getSuggestionMap().get(token).getAlternatives()) { 
    362             sb.append(alternative).append(", "); 
    363           } 
    364           sb.replace(sb.length() - 2, sb.length(), ""); // Remove last comma and space. 
    365         } 
    366         sb.append(" } ,"); 
    367       } 
    368       log.info(sb.replace(sb.length() - 2, sb.length(), "").toString()); // Remove last comma and space. 
    369     } 
    370395 
    371396    List<SearchHit> searchResults = new ArrayList<SearchHit>(); 
     
    392417          score, doi, title, highlights, authorList, publicationDate, eissn, journal, articleType); 
    393418 
    394       log.debug(hit.toString()); 
     419      if (log.isDebugEnabled()) 
     420        log.debug(hit.toString()); 
    395421 
    396422      searchResults.add(hit); 
     
    457483    return hitHighlights; 
    458484  } 
     485 
     486  /** 
     487   * Remove dangerous and unwanted values from the Strings in selected fields in the SearchParameters parameter. 
     488   * 
     489   * @param sp A SearchParameters object the needs to have some of its fields "cleaned" 
     490   * @return The SearchParameters parameter with some of its fields "cleaned" 
     491   */ 
     492  private SearchParameters cleanStrings(SearchParameters sp) { 
     493    sp.setQuery(sp.getQuery().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "")); 
     494    sp.setTextSearchAll(sp.getTextSearchAll().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "")); 
     495    sp.setTextSearchAtLeastOne(sp.getTextSearchAtLeastOne().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "")); 
     496    sp.setTextSearchExactPhrase(sp.getTextSearchExactPhrase().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "")); 
     497    sp.setTextSearchWithout(sp.getTextSearchWithout().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "")); 
     498    return sp; 
     499  } 
    459500}