Fix to make .* regex queries more feasible (no need to send term containing * char to Solr)

This commit is contained in:
adam-m 2012-01-06 15:55:57 -05:00
parent 6afe67afa0
commit f67715bc59
2 changed files with 17 additions and 10 deletions

View File

@ -184,10 +184,15 @@ public class KeywordSearchResultFactory extends ChildFactory<KeyValueThing> {
//the query is executed later on demand //the query is executed later on demand
StringBuilder highlightQuery = new StringBuilder(); StringBuilder highlightQuery = new StringBuilder();
Collection<Term> terms = tcq.getTerms(); Collection<Term> terms = tcq.getTerms();
final int lastTerm = terms.size() -1;
int curTerm = 0;
for (Term term : terms) { for (Term term : terms) {
final String termS = KeywordSearchUtil.escapeLuceneQuery(term.getTerm(), true); final String termS = KeywordSearchUtil.escapeLuceneQuery(term.getTerm(), true);
highlightQuery.append(termS); if (! termS.contains("*")) {
highlightQuery.append(" "); highlightQuery.append(termS);
if (lastTerm != curTerm)
highlightQuery.append(" ");
}
} }
//String highlightQueryEscaped = KeywordSearchUtil.escapeLuceneQuery(highlightQuery.toString()); //String highlightQueryEscaped = KeywordSearchUtil.escapeLuceneQuery(highlightQuery.toString());
String highlightQueryEscaped = highlightQuery.toString(); String highlightQueryEscaped = highlightQuery.toString();

View File

@ -165,21 +165,23 @@ public class TermComponentQuery implements KeywordSearchQuery {
//it's much more efficient and should yield the same file IDs as per match queries //it's much more efficient and should yield the same file IDs as per match queries
//requires http POST query method due to potentially large query size //requires http POST query method due to potentially large query size
StringBuilder filesQueryB = new StringBuilder(); StringBuilder filesQueryB = new StringBuilder();
final int lastTerm = terms.size() -1; final int lastTerm = terms.size() - 1;
int curTerm = 0; int curTerm = 0;
for (Term term : terms) { for (Term term : terms) {
//final String termS = KeywordSearchUtil.escapeLuceneQuery(term.getTerm(), true);
final String termS = term.getTerm(); final String termS = term.getTerm();
filesQueryB.append(termS); if (!termS.contains("*")) {
if (curTerm != lastTerm) filesQueryB.append(termS);
filesQueryB.append(" "); if (curTerm != lastTerm) {
filesQueryB.append(" ");
}
}
++curTerm; ++curTerm;
} }
List<FsContent> uniqueMatches = new ArrayList<FsContent>(); List<FsContent> uniqueMatches = new ArrayList<FsContent>();
if (! terms.isEmpty()) { if (!terms.isEmpty()) {
LuceneQuery filesQuery = new LuceneQuery(filesQueryB.toString()); LuceneQuery filesQuery = new LuceneQuery(filesQueryB.toString());
filesQuery.escape(); //TODO escaping invididual terms above instead could make a difference to Solr filesQuery.escape();
try { try {
uniqueMatches = filesQuery.performQuery(); uniqueMatches = filesQuery.performQuery();
} catch (RuntimeException e) { } catch (RuntimeException e) {
@ -198,7 +200,7 @@ public class TermComponentQuery implements KeywordSearchQuery {
results.add(f); results.add(f);
} }
} }
return results; return results;