Skip to content

Commit 57f645f

Browse files
committed
cleaner implementation
1 parent f195d06 commit 57f645f

File tree

8 files changed

+47
-91
lines changed

8 files changed

+47
-91
lines changed

server/src/main/java/org/elasticsearch/common/lucene/search/Queries.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.elasticsearch.index.IndexVersion;
2424
import org.elasticsearch.index.mapper.NestedPathFieldMapper;
2525
import org.elasticsearch.index.mapper.SeqNoFieldMapper;
26-
import org.elasticsearch.index.query.MatchAllDocumentQueryWrapper;
2726

2827
import java.util.Collection;
2928
import java.util.Collections;
@@ -36,10 +35,6 @@ public static Query newMatchAllQuery() {
3635
return new MatchAllDocsQuery();
3736
}
3837

39-
public static Query newMatchAllQueryWrapper(String pattern) {
40-
return new MatchAllDocumentQueryWrapper(pattern);
41-
}
42-
4338
/** Return a query that matches no document. */
4439
public static Query newMatchNoDocsQuery(String reason) {
4540
return new MatchNoDocsQuery(reason);

server/src/main/java/org/elasticsearch/index/mapper/ConstantFieldType.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public final Query termQuery(Object value, SearchExecutionContext context) {
6262
public final Query internalTermQuery(Object value, QueryRewriteContext context) {
6363
String pattern = valueToString(value);
6464
if (matches(pattern, false, context)) {
65-
return Queries.newMatchAllQueryWrapper(pattern);
65+
return Queries.newMatchAllQuery();
6666
} else {
6767
return new MatchNoDocsQuery();
6868
}
@@ -76,7 +76,7 @@ public final Query termQueryCaseInsensitive(Object value, SearchExecutionContext
7676
public final Query internalTermQueryCaseInsensitive(Object value, QueryRewriteContext context) {
7777
String pattern = valueToString(value);
7878
if (matches(pattern, true, context)) {
79-
return Queries.newMatchAllQueryWrapper(pattern);
79+
return Queries.newMatchAllQuery();
8080
} else {
8181
return new MatchNoDocsQuery();
8282
}
@@ -88,7 +88,7 @@ public final Query termsQuery(Collection<?> values, SearchExecutionContext conte
8888
String pattern = valueToString(value);
8989
if (matches(pattern, false, context)) {
9090
// `terms` queries are a disjunction, so one matching term is enough
91-
return Queries.newMatchAllQueryWrapper(pattern);
91+
return Queries.newMatchAllQuery();
9292
}
9393
}
9494
return new MatchNoDocsQuery();
@@ -103,7 +103,7 @@ public final Query prefixQuery(
103103
) {
104104
String pattern = prefix + "*";
105105
if (matches(pattern, caseInsensitive, context)) {
106-
return Queries.newMatchAllQueryWrapper(pattern);
106+
return Queries.newMatchAllQuery();
107107
} else {
108108
return new MatchNoDocsQuery();
109109
}
@@ -117,7 +117,7 @@ public final Query wildcardQuery(
117117
SearchExecutionContext context
118118
) {
119119
if (matches(value, caseInsensitive, context)) {
120-
return Queries.newMatchAllQueryWrapper(value);
120+
return Queries.newMatchAllQuery();
121121
} else {
122122
return new MatchNoDocsQuery();
123123
}

server/src/main/java/org/elasticsearch/index/query/MatchAllDocumentQueryWrapper.java

Lines changed: 0 additions & 55 deletions
This file was deleted.

server/src/main/java/org/elasticsearch/index/query/QueryBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ public interface QueryBuilder extends VersionedNamedWriteable, ToXContentObject,
2626
*/
2727
Query toQuery(SearchExecutionContext context) throws IOException;
2828

29+
/**
30+
* Converts this QueryBuilder to a lucene {@link Query}.
31+
* Returns {@code null} if this query should be ignored in the context of highlighting.
32+
*
33+
* @param fieldName name of the field we want to highlight
34+
* @return the {@link Query} or {@code null} if this query should have standard behaviour
35+
* for highlighting.
36+
*/
37+
default Query toDoHighlight(String fieldName) {
38+
return null;
39+
}
40+
2941
/**
3042
* Sets the arbitrary name to be assigned to the query (see named queries).
3143
* Implementers should return the concrete type of the

server/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88

99
package org.elasticsearch.index.query;
1010

11+
import org.apache.lucene.index.Term;
1112
import org.apache.lucene.search.BoostQuery;
1213
import org.apache.lucene.search.FuzzyQuery;
1314
import org.apache.lucene.search.Query;
15+
import org.apache.lucene.search.WildcardQuery;
1416
import org.apache.lucene.util.automaton.Operations;
1517
import org.elasticsearch.TransportVersion;
1618
import org.elasticsearch.common.ParsingException;
@@ -970,4 +972,9 @@ protected Query doToQuery(SearchExecutionContext context) throws IOException {
970972
public TransportVersion getMinimalSupportedVersion() {
971973
return TransportVersion.ZERO;
972974
}
975+
976+
@Override
977+
public Query toDoHighlight(String fieldName) {
978+
return new WildcardQuery(new Term(fieldName, queryString));
979+
}
973980
}

server/src/main/java/org/elasticsearch/search/SearchService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import org.elasticsearch.search.fetch.subphase.FetchFieldsContext;
9191
import org.elasticsearch.search.fetch.subphase.ScriptFieldsContext.ScriptField;
9292
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
93+
import org.elasticsearch.search.fetch.subphase.highlight.SearchHighlightContext;
9394
import org.elasticsearch.search.internal.AliasFilter;
9495
import org.elasticsearch.search.internal.InternalScrollSearchRequest;
9596
import org.elasticsearch.search.internal.LegacyReaderContext;
@@ -1284,7 +1285,9 @@ private void parseSource(DefaultSearchContext context, SearchSourceBuilder sourc
12841285
if (source.highlighter() != null) {
12851286
HighlightBuilder highlightBuilder = source.highlighter();
12861287
try {
1287-
context.highlight(highlightBuilder.build(searchExecutionContext));
1288+
SearchHighlightContext searchHighlightContext = highlightBuilder.build(searchExecutionContext);
1289+
searchHighlightContext.setOriginalQuery(source.query());
1290+
context.highlight(searchHighlightContext);
12881291
} catch (IOException e) {
12891292
throw new SearchException(shardTarget, "failed to create SearchContextHighlighter", e);
12901293
}

server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightPhase.java

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,12 @@
99
package org.elasticsearch.search.fetch.subphase.highlight;
1010

1111
import org.apache.lucene.index.LeafReaderContext;
12-
import org.apache.lucene.index.Term;
13-
import org.apache.lucene.search.DisjunctionMaxQuery;
14-
import org.apache.lucene.search.MatchNoDocsQuery;
1512
import org.apache.lucene.search.Query;
16-
import org.apache.lucene.search.TermQuery;
17-
import org.elasticsearch.common.regex.Regex;
1813
import org.elasticsearch.index.mapper.ConstantFieldType;
1914
import org.elasticsearch.index.mapper.KeywordFieldMapper;
2015
import org.elasticsearch.index.mapper.MappedFieldType;
2116
import org.elasticsearch.index.mapper.TextFieldMapper;
22-
import org.elasticsearch.index.query.MatchAllDocumentQueryWrapper;
17+
import org.elasticsearch.index.query.QueryBuilder;
2318
import org.elasticsearch.search.fetch.FetchContext;
2419
import org.elasticsearch.search.fetch.FetchSubPhase;
2520
import org.elasticsearch.search.fetch.FetchSubPhaseProcessor;
@@ -146,7 +141,7 @@ private FieldContext contextBuilders(
146141
sourceRequired = true;
147142
}
148143

149-
Query highlightQuery = getHighlightQuery(context, field, fieldType);
144+
Query highlightQuery = getHighlightQuery(highlightContext, field, fieldType);
150145

151146
builders.put(
152147
fieldName,
@@ -166,25 +161,15 @@ private FieldContext contextBuilders(
166161
return new FieldContext(storedFieldsSpec, builders);
167162
}
168163

169-
private Query getHighlightQuery(FetchContext context, SearchHighlightContext.Field field, MappedFieldType fieldType) {
170-
if (fieldType instanceof ConstantFieldType constantFieldType) {
171-
return getHighlightQueryForConstantFieldType(context, constantFieldType);
164+
private Query getHighlightQuery(
165+
SearchHighlightContext highlightContext,
166+
SearchHighlightContext.Field field,
167+
MappedFieldType fieldType
168+
) {
169+
if (fieldType instanceof ConstantFieldType) {
170+
QueryBuilder originalQuery = highlightContext.getOriginalQuery();
171+
return originalQuery.toDoHighlight(fieldType.name());
172172
}
173173
return field.fieldOptions().highlightQuery();
174174
}
175-
176-
private Query getHighlightQueryForConstantFieldType(FetchContext context, ConstantFieldType fieldType) {
177-
if (context.query() instanceof MatchAllDocumentQueryWrapper matchAllDocumentQueryWrapper) {
178-
return new TermQuery(new Term(fieldType.name(), matchAllDocumentQueryWrapper.getPattern()));
179-
} else if (context.query() instanceof DisjunctionMaxQuery unionOfQueries) {
180-
for (Query query : unionOfQueries.getDisjuncts()) {
181-
if (query instanceof MatchAllDocumentQueryWrapper matchAllDocumentQueryWrapper) {
182-
if (Regex.simpleMatch(matchAllDocumentQueryWrapper.getPattern(), fieldType.getConstantValue(context))) {
183-
return new TermQuery(new Term(fieldType.name(), fieldType.getConstantValue(context)));
184-
}
185-
}
186-
}
187-
}
188-
return new MatchNoDocsQuery();
189-
}
190175
}

server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/SearchHighlightContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import org.apache.lucene.search.Query;
1212
import org.elasticsearch.common.util.Maps;
13+
import org.elasticsearch.index.query.QueryBuilder;
1314
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder.BoundaryScannerType;
1415

1516
import java.util.Arrays;
@@ -20,7 +21,11 @@
2021
import java.util.Set;
2122

2223
public class SearchHighlightContext {
24+
public void setOriginalQuery(QueryBuilder originalQuery) {
25+
this.originalQuery = originalQuery;
26+
}
2327

28+
private QueryBuilder originalQuery;
2429
private final Map<String, Field> fields;
2530

2631
public SearchHighlightContext(Collection<Field> fields) {
@@ -35,6 +40,10 @@ public Collection<Field> fields() {
3540
return fields.values();
3641
}
3742

43+
public QueryBuilder getOriginalQuery() {
44+
return originalQuery;
45+
}
46+
3847
public static class Field {
3948
private final String field;
4049
private final FieldOptions fieldOptions;

0 commit comments

Comments
 (0)