Optimizated algorithm and removed code duplication

This commit is contained in:
Eugene Livis 2016-07-15 13:33:14 -04:00
parent 102b2b4c56
commit 77330b8c32

View File

@ -247,17 +247,16 @@ class KeywordSearchResultFactory extends ChildFactory<KeyValueQueryContent> {
* @return * @return
*/ */
private String getHighlightQuery(KeywordSearchQuery query, boolean literal_query, QueryResults queryResults, Content content) { private String getHighlightQuery(KeywordSearchQuery query, boolean literal_query, QueryResults queryResults, Content content) {
StringBuilder highlightQuery = new StringBuilder();
if (literal_query) { if (literal_query) {
//literal, treat as non-regex, non-term component query //literal, treat as non-regex, non-term component query
highlightQuery.append(LuceneQuery.HIGHLIGHT_FIELD_LITERAL).append(":").append("\"").append(KeywordSearchUtil.escapeLuceneQuery(query.getQueryString())).append("\""); return constructEscapedSolrQuery(query.getQueryString(), literal_query);
} else { } else {
//construct a Solr query using aggregated terms to get highlighting //construct a Solr query using aggregated terms to get highlighting
//the query is executed later on demand //the query is executed later on demand
if (queryResults.getKeywords().size() == 1) { if (queryResults.getKeywords().size() == 1) {
//simple case, no need to process subqueries and do special escaping //simple case, no need to process subqueries and do special escaping
Keyword term = queryResults.getKeywords().iterator().next(); Keyword term = queryResults.getKeywords().iterator().next();
highlightQuery.append(LuceneQuery.HIGHLIGHT_FIELD_REGEX).append(":").append("\"").append(KeywordSearchUtil.escapeLuceneQuery(term.getQuery())).append("\""); return constructEscapedSolrQuery(term.getQuery(), literal_query);
} else { } else {
//find terms for this content hit //find terms for this content hit
List<Keyword> hitTerms = new ArrayList<>(); List<Keyword> hitTerms = new ArrayList<>();
@ -270,20 +269,39 @@ class KeywordSearchResultFactory extends ChildFactory<KeyValueQueryContent> {
} }
} }
StringBuilder highlightQuery = new StringBuilder();
final int lastTerm = hitTerms.size() - 1; final int lastTerm = hitTerms.size() - 1;
int curTerm = 0; int curTerm = 0;
for (Keyword term : hitTerms) { for (Keyword term : hitTerms) {
//escape subqueries, MAKE SURE they are not escaped again later //escape subqueries, MAKE SURE they are not escaped again later
highlightQuery.append(LuceneQuery.HIGHLIGHT_FIELD_REGEX).append(":").append("\"").append(KeywordSearchUtil.escapeLuceneQuery(term.getQuery())).append("\""); highlightQuery.append(constructEscapedSolrQuery(term.getQuery(), literal_query));
if (lastTerm != curTerm) { if (lastTerm != curTerm) {
highlightQuery.append(" "); //acts as OR || highlightQuery.append(" "); //acts as OR ||
} }
++curTerm; ++curTerm;
} }
return highlightQuery.toString();
} }
} }
}
/**
* Constructs a complete, escaped Solr query that is ready to be used.
*
* @param query keyword term to be searched for
* @param literal_query flag whether query is literal or regex
* @return Solr query string
*/
private String constructEscapedSolrQuery(String query, boolean literal_query) {
StringBuilder highlightQuery = new StringBuilder();
String highLightField;
if (literal_query) {
highLightField = LuceneQuery.HIGHLIGHT_FIELD_LITERAL;
} else {
highLightField = LuceneQuery.HIGHLIGHT_FIELD_REGEX;
}
highlightQuery.append(highLightField).append(":").append("\"").append(KeywordSearchUtil.escapeLuceneQuery(query)).append("\"");
return highlightQuery.toString(); return highlightQuery.toString();
} }