Changeset 8267
- Timestamp:
- 03/05/10 13:19:55 (5 months ago)
- Location:
- head/ambra/webapp/src/main/java/org/topazproject/ambra/search2
- Files:
-
- 2 modified
-
SearchParameters.java (modified) (1 diff)
-
service/SolrSearchService.java (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
head/ambra/webapp/src/main/java/org/topazproject/ambra/search2/SearchParameters.java
r8264 r8267 313 313 public void setPageSize(int pageSize) { 314 314 this.pageSize = pageSize; 315 } 316 317 /** 318 * Creates a deep copy of this SearchParameters object. 319 * 320 * @return a deep copy of this SearchParameters object. 321 */ 322 public SearchParameters copy() { 323 SearchParameters sp = new SearchParameters(); 324 sp.setQuery(this.getQuery()); 325 sp.setTextSearchAll(this.getTextSearchAll()); 326 sp.setTextSearchAtLeastOne(this.getTextSearchAtLeastOne()); 327 sp.setTextSearchExactPhrase(this.getTextSearchExactPhrase()); 328 sp.setTextSearchWithout(this.getTextSearchWithout()); 329 sp.setTextSearchOption(this.getTextSearchOption()); 330 sp.setCreator(this.getCreator().clone()); 331 sp.setAuthorNameOp(this.getAuthorNameOp()); 332 sp.setSubjectCatOpt(this.getSubjectCatOpt()); 333 sp.setDateTypeSelect(this.getDateTypeSelect()); 334 if (this.getStartDate() == null) 335 sp.setStartDate(null); 336 else 337 sp.setStartDate((Date)this.getStartDate().clone()); 338 if (this.getEndDate() == null) 339 sp.setEndDate(null); 340 else 341 sp.setEndDate((Date)this.getEndDate().clone()); 342 sp.setLimitToCategory(this.getLimitToCategory().clone()); 343 sp.setJournalOpt(this.getJournalOpt()); 344 sp.setLimitToJournal(this.getLimitToJournal().clone()); 345 sp.setStartPage(this.getStartPage()); 346 sp.setPageSize(this.getPageSize()); 347 return sp; 315 348 } 316 349 -
head/ambra/webapp/src/main/java/org/topazproject/ambra/search2/service/SolrSearchService.java
r8265 r8267 69 69 */ 70 70 public SearchResultSinglePage simpleSearch(String queryString, String eissn, int startPage, int pageSize) throws ApplicationException { 71 queryString = queryString.replaceAll("AND", "").replaceAll("OR", "");71 queryString = cleanString(queryString); 72 72 log.debug("Simple Search performed on the String: " + queryString 73 73 + " startPage: " + startPage … … 83 83 84 84 public SearchResultSinglePage advancedSearch(SearchParameters searchParameters) throws ApplicationException { 85 searchParameters= cleanStrings(searchParameters);86 log.debug("Advanced Search performed on the SearchParameters: " + s earchParameters);87 88 SolrQuery query = createQuery(null, s earchParameters.getStartPage(), searchParameters.getPageSize());85 SearchParameters sp = cleanStrings(searchParameters); 86 log.debug("Advanced Search performed on the SearchParameters: " + sp); 87 88 SolrQuery query = createQuery(null, sp.getStartPage(), sp.getPageSize()); 89 89 90 90 // Set highlighting fields. Defaults to field list in "highlightFieldsDefault" variable. 91 if ("abstract".equals(s earchParameters.getTextSearchExactPhrase())) {91 if ("abstract".equals(sp.getTextSearchExactPhrase())) { 92 92 query.set("hl.fl", "abstract"); 93 } else if ("refs".equals(s earchParameters.getTextSearchOption())) {93 } else if ("refs".equals(sp.getTextSearchOption())) { 94 94 query.set("hl.fl", "citation"); 95 } else if ("title".equals(s earchParameters.getTextSearchOption())) {95 } else if ("title".equals(sp.getTextSearchOption())) { 96 96 query.set("hl.fl", "title"); 97 97 } … … 100 100 101 101 // Form field description: "Author Name:" 102 if (s earchParameters.getCreator().length > 0 && StringUtils.isNotBlank(searchParameters.getCreator()[0])) {102 if (sp.getCreator().length > 0 && StringUtils.isNotBlank(sp.getCreator()[0])) { 103 103 q.append(" ( "); 104 for (int i = 0; i < s earchParameters.getCreator().length; i++) {105 String creatorName = s earchParameters.getCreator()[i];104 for (int i = 0; i < sp.getCreator().length; i++) { 105 String creatorName = sp.getCreator()[i]; 106 106 if (StringUtils.isNotBlank(creatorName)) { 107 107 q.append(" author:\"").append(creatorName).append("\""); 108 108 } 109 if (i < s earchParameters.getCreator().length - 1110 && StringUtils.isNotBlank(s earchParameters.getCreator()[i + 1])) {111 if ("all".equals(s earchParameters.getAuthorNameOp())) {109 if (i < sp.getCreator().length - 1 110 && StringUtils.isNotBlank(sp.getCreator()[i + 1])) { 111 if ("all".equals(sp.getAuthorNameOp())) { 112 112 q.append(" AND "); 113 113 } else { … … 120 120 121 121 // Form field description: "for at least one of the words:" 122 if (s earchParameters.getTextSearchAtLeastOne().trim().length() > 0) {122 if (sp.getTextSearchAtLeastOne().trim().length() > 0) { 123 123 q.append(" AND ").append( 124 addFields(" OR ", s earchParameters.getTextSearchOption(), searchParameters.getTextSearchAtLeastOne().trim())124 addFields(" OR ", sp.getTextSearchOption(), sp.getTextSearchAtLeastOne().trim()) 125 125 ); 126 126 } 127 127 128 128 // Form field description: "for all the words:" 129 if (s earchParameters.getTextSearchAll().trim().length() > 0) {129 if (sp.getTextSearchAll().trim().length() > 0) { 130 130 q.append(" AND ").append( 131 addFields(" AND ", s earchParameters.getTextSearchOption(), searchParameters.getTextSearchAll().trim())131 addFields(" AND ", sp.getTextSearchOption(), sp.getTextSearchAll().trim()) 132 132 ); 133 133 } 134 134 135 135 // Form field description: "for the exact phrase:" 136 if (s earchParameters.getTextSearchExactPhrase().trim().length() > 0) {136 if (sp.getTextSearchExactPhrase().trim().length() > 0) { 137 137 q.append(" AND "); 138 if ("abstract".equals(s earchParameters.getTextSearchOption())) {139 q.append("abstract:\"").append(s earchParameters.getTextSearchExactPhrase().trim()).append("\"");140 } else if ("refs".equals(s earchParameters.getTextSearchOption())) {141 q.append("citation:\"").append(s earchParameters.getTextSearchExactPhrase().trim()).append("\"");142 } else if ("title".equals(s earchParameters.getTextSearchOption())) {143 q.append("title:\"").append(s earchParameters.getTextSearchExactPhrase().trim()).append("\"");144 } else { 145 q.append("\"").append(s earchParameters.getTextSearchExactPhrase().trim()).append("\"");138 if ("abstract".equals(sp.getTextSearchOption())) { 139 q.append("abstract:\"").append(sp.getTextSearchExactPhrase().trim()).append("\""); 140 } else if ("refs".equals(sp.getTextSearchOption())) { 141 q.append("citation:\"").append(sp.getTextSearchExactPhrase().trim()).append("\""); 142 } else if ("title".equals(sp.getTextSearchOption())) { 143 q.append("title:\"").append(sp.getTextSearchExactPhrase().trim()).append("\""); 144 } else { 145 q.append("\"").append(sp.getTextSearchExactPhrase().trim()).append("\""); 146 146 } 147 147 q.append(" "); … … 149 149 150 150 // Form field description: "without the words:" 151 if (s earchParameters.getTextSearchWithout().trim().length() > 0) {151 if (sp.getTextSearchWithout().trim().length() > 0) { 152 152 q.append(" AND ").append( 153 addFieldsWithoutTheWords(" AND ", s earchParameters.getTextSearchOption(),154 s earchParameters.getTextSearchWithout().trim())153 addFieldsWithoutTheWords(" AND ", sp.getTextSearchOption(), 154 sp.getTextSearchWithout().trim()) 155 155 ); 156 156 } 157 157 158 158 // Form field description: "Dates". Query Filter. 159 if (s earchParameters.getDateTypeSelect().trim().length() > 0) {160 query.addFilterQuery(createFilterDateRange(s earchParameters.getStartDate(), searchParameters.getEndDate()));159 if (sp.getDateTypeSelect().trim().length() > 0) { 160 query.addFilterQuery(createFilterDateRange(sp.getStartDate(), sp.getEndDate())); 161 161 } 162 162 163 163 // Form field description: "Journals". Query Filter. 164 if ("some".equals(s earchParameters.getJournalOpt()) && searchParameters.getLimitToJournal().length > 0) {165 query.addFilterQuery(createFilterLimitToJournals(s earchParameters.getLimitToJournal()));164 if ("some".equals(sp.getJournalOpt()) && sp.getLimitToJournal().length > 0) { 165 query.addFilterQuery(createFilterLimitToJournals(sp.getLimitToJournal())); 166 166 } 167 167 168 168 // Form field description: "Subject Categories". Query Filter. 169 if ("some".equals(s earchParameters.getSubjectCatOpt()) && searchParameters.getLimitToCategory().length > 0) {170 query.addFilterQuery(createFilterLimitToCategories(s earchParameters.getLimitToCategory()));169 if ("some".equals(sp.getSubjectCatOpt()) && sp.getLimitToCategory().length > 0) { 170 query.addFilterQuery(createFilterLimitToCategories(sp.getLimitToCategory())); 171 171 } 172 172 … … 238 238 SolrQuery query = new SolrQuery(queryString); 239 239 query.setTimeAllowed(queryTimeout); 240 query.set("fl", "title^2.0", "abstract^1.5", "body^1.0"); // Score weighting.241 240 query.setIncludeScore(true); // The relevance (of each results element) to the search terms. 242 241 query.setHighlight(true); … … 485 484 * Remove dangerous and unwanted values from the Strings in selected fields in the SearchParameters parameter. 486 485 * 487 * @param s pA SearchParameters object the needs to have some of its fields "cleaned"486 * @param searchParameters A SearchParameters object the needs to have some of its fields "cleaned" 488 487 * @return The SearchParameters parameter with some of its fields "cleaned" 489 488 */ 490 private SearchParameters cleanStrings(SearchParameters sp) { 491 sp.setQuery(sp.getQuery().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "").toLowerCase()); 492 if (sp.getCreator().length > 0) { 493 String [] tempCreator = new String[sp.getCreator().length]; 489 private SearchParameters cleanStrings(SearchParameters searchParameters) { 490 SearchParameters sp = searchParameters.copy(); 491 sp.setQuery(cleanString(searchParameters.getQuery())); 492 if (searchParameters.getCreator().length > 0) { 493 String [] tempCreator = new String[searchParameters.getCreator().length]; 494 494 int counter = 0; 495 for (String author : s p.getCreator()) {496 tempCreator[counter++] = author.replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "").toLowerCase();495 for (String author : searchParameters.getCreator()) { 496 tempCreator[counter++] = cleanString(author); 497 497 } 498 498 sp.setCreator(tempCreator); 499 499 } 500 sp.setTextSearchAll( sp.getTextSearchAll().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "").toLowerCase());501 sp.setTextSearchAtLeastOne( sp.getTextSearchAtLeastOne().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "").toLowerCase());502 sp.setTextSearchExactPhrase( sp.getTextSearchExactPhrase().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "").toLowerCase());503 sp.setTextSearchWithout( sp.getTextSearchWithout().replaceAll(" AND", "").replaceAll(" OR", "").replaceAll("AND ", "").replaceAll("OR ", "").toLowerCase());500 sp.setTextSearchAll(cleanString(searchParameters.getTextSearchAll())); 501 sp.setTextSearchAtLeastOne(cleanString(searchParameters.getTextSearchAtLeastOne())); 502 sp.setTextSearchExactPhrase(cleanString(searchParameters.getTextSearchExactPhrase())); 503 sp.setTextSearchWithout(cleanString(searchParameters.getTextSearchWithout())); 504 504 return sp; 505 505 } 506 507 /** 508 * TODO: add [ and ] but only if they are PAIRED! Used for ranges. 509 * 510 * TODO: Check that ^ is followed by a NUMBER (integer or float). Used for "boosting" terms in sort 511 * 512 * TODO: allow AND and OR and NOT, but that requires that our algorythm be able to construct complex boolean que 513 * 514 * @param toBeCleaned 515 * @return 516 */ 517 private String cleanString(String toBeCleaned) { 518 return toBeCleaned 519 .replaceAll("[^\\w\\s\\?\\*]", "") 520 .replaceAll("_", " ") 521 .replaceAll("-", " ") 522 .replaceAll(" AND", "").replaceAll("AND ", "") 523 .replaceAll(" OR", "").replaceAll("OR ", "") 524 .replaceAll(" NOT", "").replaceAll("NOT ", ""); 525 } 506 526 }
