Skip to content

Commit cb8faaa

Browse files
committed
improve query handling (rewrite) when searching, try and minize the number of rewrites. Also, better highlighting when wrapping in filtered query
1 parent 5f98942 commit cb8faaa

File tree

6 files changed

+63
-22
lines changed

6 files changed

+63
-22
lines changed

modules/elasticsearch/src/main/java/org/apache/lucene/search/vectorhighlight/CustomFieldQuery.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.lucene.index.Term;
2424
import org.apache.lucene.search.*;
2525
import org.apache.lucene.search.spans.SpanTermQuery;
26+
import org.elasticsearch.util.lucene.search.CustomBoostFactorQuery;
2627
import org.elasticsearch.util.lucene.search.TermFilter;
2728

2829
import java.io.IOException;
@@ -73,10 +74,9 @@ public CustomFieldQuery(Query query, boolean phraseHighlight, boolean fieldMatch
7374
flatQueries.add(termQuery);
7475
}
7576
} else if (sourceQuery instanceof ConstantScoreQuery) {
76-
Boolean highlight = highlightFilters.get();
77-
if (highlight != null && highlight.equals(Boolean.TRUE)) {
78-
flatten(((ConstantScoreQuery) sourceQuery).getFilter(), flatQueries);
79-
}
77+
flatten(((ConstantScoreQuery) sourceQuery).getFilter(), flatQueries);
78+
} else if (sourceQuery instanceof CustomBoostFactorQuery) {
79+
flatten(((CustomBoostFactorQuery) sourceQuery).getSubQuery(), flatQueries);
8080
} else if (sourceQuery instanceof MultiTermQuery) {
8181
MultiTermQuery multiTermQuery = (MultiTermQuery) sourceQuery;
8282
MultiTermQuery.RewriteMethod rewriteMethod = multiTermQuery.getRewriteMethod();
@@ -87,16 +87,25 @@ public CustomFieldQuery(Query query, boolean phraseHighlight, boolean fieldMatch
8787
flatten(multiTermQuery.rewrite(reader.get()), flatQueries);
8888
} catch (IOException e) {
8989
// ignore
90+
} catch (BooleanQuery.TooManyClauses e) {
91+
// ignore
9092
} finally {
9193
multiTermQuery.setRewriteMethod(rewriteMethod);
9294
}
9395
}
96+
} else if (sourceQuery instanceof FilteredQuery) {
97+
flatten(((FilteredQuery) sourceQuery).getQuery(), flatQueries);
98+
flatten(((FilteredQuery) sourceQuery).getFilter(), flatQueries);
9499
} else {
95100
super.flatten(sourceQuery, flatQueries);
96101
}
97102
}
98103

99104
void flatten(Filter sourceFilter, Collection<Query> flatQueries) {
105+
Boolean highlight = highlightFilters.get();
106+
if (highlight == null || highlight.equals(Boolean.FALSE)) {
107+
return;
108+
}
100109
if (sourceFilter instanceof TermFilter) {
101110
flatten(new TermQuery(((TermFilter) sourceFilter).getTerm()), flatQueries);
102111
} else if (sourceFilter instanceof PublicTermsFilter) {

modules/elasticsearch/src/main/java/org/elasticsearch/search/SearchContextException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public SearchContextException(SearchContext context, String msg, Throwable t) {
3737
private static String buildMessage(SearchContext context, String msg) {
3838
StringBuilder sb = new StringBuilder();
3939
sb.append('[').append(context.shardTarget().index()).append("][").append(context.shardTarget().shardId()).append("]: ");
40-
sb.append("query[").append(context.query()).append("],from[").append(context.from()).append("],size[").append(context.size()).append("]");
40+
sb.append("query[").append(context.originalQuery()).append("],from[").append(context.from()).append("],size[").append(context.size()).append("]");
4141
if (context.sort() != null) {
4242
sb.append(",sort[").append(context.sort()).append("]");
4343
}

modules/elasticsearch/src/main/java/org/elasticsearch/search/dfs/DfsPhase.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ public class DfsPhase implements SearchPhase {
4242

4343
public void execute(SearchContext context) {
4444
try {
45-
context.rewriteQuery();
45+
if (!context.queryRewritten()) {
46+
context.updateRewriteQuery(context.searcher().rewrite(context.query()));
47+
}
4648

4749
THashSet<Term> termsSet = new THashSet<Term>();
4850
context.query().extractTerms(termsSet);

modules/elasticsearch/src/main/java/org/elasticsearch/search/highlight/HighlighterParseElement.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ public class HighlighterParseElement implements SearchParseElement {
106106
if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) {
107107
highlightFilter = jp.getIntValue() != 0;
108108
}
109-
} else if (token == JsonToken.VALUE_FALSE) {
109+
} else if (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE) {
110110
if ("highlight_filter".equals(topLevelFieldName) || "highlightFilter".equals(topLevelFieldName)) {
111-
highlightFilter = false;
111+
highlightFilter = token == JsonToken.VALUE_TRUE;
112112
}
113113
} else if (token == JsonToken.START_OBJECT) {
114114
if ("fields".equals(topLevelFieldName)) {

modules/elasticsearch/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import java.io.IOException;
2929

3030
/**
31-
* @author kimchy (Shay Banon)
31+
* @author kimchy (shay.banon)
3232
*/
3333
public class ContextIndexSearcher extends IndexSearcher {
3434

@@ -57,6 +57,20 @@ public OpenBitSet docIdSet() {
5757
return docIdSet;
5858
}
5959

60+
@Override public Query rewrite(Query original) throws IOException {
61+
if (original == searchContext.query() || original == searchContext.originalQuery()) {
62+
// optimize in case its the top level search query and we already rewrote it...
63+
if (searchContext.queryRewritten()) {
64+
return searchContext.query();
65+
}
66+
Query rewriteQuery = super.rewrite(original);
67+
searchContext.updateRewriteQuery(rewriteQuery);
68+
return rewriteQuery;
69+
} else {
70+
return super.rewrite(original);
71+
}
72+
}
73+
6074
@Override protected Weight createWeight(Query query) throws IOException {
6175
if (dfSource == null) {
6276
return super.createWeight(query);

modules/elasticsearch/src/main/java/org/elasticsearch/search/internal/SearchContext.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ public class SearchContext implements Releasable {
8686

8787
private String queryParserName;
8888

89+
private Query originalQuery;
90+
8991
private Query query;
9092

9193
private int[] docIdsToLoad;
@@ -238,19 +240,42 @@ public SearchContext queryParserName(String queryParserName) {
238240
}
239241

240242
public SearchContext query(Query query) {
241-
if (query == null) {
242-
this.query = query;
243-
return this;
244-
}
245243
queryRewritten = false;
244+
this.originalQuery = query;
246245
this.query = query;
247246
return this;
248247
}
249248

249+
/**
250+
* The original query to execute, unmodified.
251+
*/
252+
public Query originalQuery() {
253+
return this.originalQuery;
254+
}
255+
256+
/**
257+
* The query to execute, might be rewritten.
258+
*/
250259
public Query query() {
251260
return this.query;
252261
}
253262

263+
/**
264+
* Has the query been rewritten already?
265+
*/
266+
public boolean queryRewritten() {
267+
return queryRewritten;
268+
}
269+
270+
/**
271+
* Rewrites the query and updates it. Only happens once.
272+
*/
273+
public SearchContext updateRewriteQuery(Query rewriteQuery) {
274+
query = rewriteQuery;
275+
queryRewritten = true;
276+
return this;
277+
}
278+
254279
public int from() {
255280
return from;
256281
}
@@ -286,15 +311,6 @@ public void explain(boolean explain) {
286311
this.explain = explain;
287312
}
288313

289-
public SearchContext rewriteQuery() throws IOException {
290-
if (queryRewritten) {
291-
return this;
292-
}
293-
query = query.rewrite(searcher.getIndexReader());
294-
queryRewritten = true;
295-
return this;
296-
}
297-
298314
public int[] docIdsToLoad() {
299315
return docIdsToLoad;
300316
}

0 commit comments

Comments
 (0)