Skip to content

Commit 10ddd69

Browse files
committed
Internal: move to lucene BoostQuery
Latest version of lucene deprecated Query#setBoost and Query#getBoost which made queries effectively immutable. Those methods need to be replaced with `BoostQuery` that wraps any query that needs boosting. This commit replaces usages of setBoost with BoostQuery and adds it to forbidden-apis for prod code. Usages of `getBoost` are only partially removed, as some will have to stay for backwards compatibility. Closes #14264
1 parent 102e254 commit 10ddd69

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+380
-700
lines changed

buildSrc/src/main/resources/forbidden/core-signatures.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,6 @@ java.util.concurrent.Future#cancel(boolean)
8787
@defaultMessage Don't try reading from paths that are not configured in Environment, resolve from Environment instead
8888
org.elasticsearch.common.io.PathUtils#get(java.lang.String, java.lang.String[])
8989
org.elasticsearch.common.io.PathUtils#get(java.net.URI)
90+
91+
@defaultMessage Don't use deprecated Query#setBoost, wrap the query into a BoostQuery instead
92+
org.apache.lucene.search.Query#setBoost(float)

core/src/main/java/org/apache/lucene/queries/BlendedTermQuery.java

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,17 @@
1818
*/
1919
package org.apache.lucene.queries;
2020

21-
import org.apache.lucene.index.IndexReader;
22-
import org.apache.lucene.index.IndexReaderContext;
23-
import org.apache.lucene.index.LeafReaderContext;
24-
import org.apache.lucene.index.Term;
25-
import org.apache.lucene.index.TermContext;
26-
import org.apache.lucene.index.TermState;
27-
import org.apache.lucene.search.BooleanClause;
21+
import org.apache.lucene.index.*;
22+
import org.apache.lucene.search.*;
2823
import org.apache.lucene.search.BooleanClause.Occur;
29-
import org.apache.lucene.search.BooleanQuery;
30-
import org.apache.lucene.search.DisjunctionMaxQuery;
31-
import org.apache.lucene.search.Query;
32-
import org.apache.lucene.search.TermQuery;
3324
import org.apache.lucene.util.ArrayUtil;
3425
import org.apache.lucene.util.InPlaceMergeSorter;
3526
import org.apache.lucene.util.ToStringUtils;
3627

3728
import java.io.IOException;
3829
import java.util.Arrays;
3930
import java.util.List;
31+
import java.util.Objects;
4032

4133
/**
4234
* BlendedTermQuery can be used to unify term statistics across
@@ -77,6 +69,10 @@ public BlendedTermQuery(Term[] terms, float[] boosts) {
7769

7870
@Override
7971
public Query rewrite(IndexReader reader) throws IOException {
72+
Query rewritten = super.rewrite(reader);
73+
if (rewritten != this) {
74+
return rewritten;
75+
}
8076
IndexReaderContext context = reader.getContext();
8177
TermContext[] ctx = new TermContext[terms.length];
8278
int[] docFreqs = new int[ctx.length];
@@ -87,9 +83,7 @@ public Query rewrite(IndexReader reader) throws IOException {
8783

8884
final int maxDoc = reader.maxDoc();
8985
blend(ctx, maxDoc, reader);
90-
Query query = topLevelQuery(terms, ctx, docFreqs, maxDoc);
91-
query.setBoost(getBoost());
92-
return query;
86+
return topLevelQuery(terms, ctx, docFreqs, maxDoc);
9387
}
9488

9589
protected abstract Query topLevelQuery(Term[] terms, TermContext[] ctx, int[] docFreqs, int maxDoc);
@@ -274,20 +268,15 @@ private Term[] equalsTerms() {
274268
@Override
275269
public boolean equals(Object o) {
276270
if (this == o) return true;
277-
if (o == null || getClass() != o.getClass()) return false;
278271
if (!super.equals(o)) return false;
279272

280273
BlendedTermQuery that = (BlendedTermQuery) o;
281-
if (!Arrays.equals(equalsTerms(), that.equalsTerms())) return false;
282-
283-
return true;
274+
return Arrays.equals(equalsTerms(), that.equalsTerms());
284275
}
285276

286277
@Override
287278
public int hashCode() {
288-
int result = super.hashCode();
289-
result = 31 * result + Arrays.hashCode(equalsTerms());
290-
return result;
279+
return Objects.hash(super.hashCode(), Arrays.hashCode(equalsTerms()));
291280
}
292281

293282
public static BlendedTermQuery booleanBlendedQuery(Term[] terms, final boolean disableCoord) {
@@ -298,16 +287,16 @@ public static BlendedTermQuery booleanBlendedQuery(Term[] terms, final float[] b
298287
return new BlendedTermQuery(terms, boosts) {
299288
@Override
300289
protected Query topLevelQuery(Term[] terms, TermContext[] ctx, int[] docFreqs, int maxDoc) {
301-
BooleanQuery.Builder query = new BooleanQuery.Builder();
302-
query.setDisableCoord(disableCoord);
290+
BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
291+
booleanQueryBuilder.setDisableCoord(disableCoord);
303292
for (int i = 0; i < terms.length; i++) {
304-
TermQuery termQuery = new TermQuery(terms[i], ctx[i]);
305-
if (boosts != null) {
306-
termQuery.setBoost(boosts[i]);
293+
Query query = new TermQuery(terms[i], ctx[i]);
294+
if (boosts != null && boosts[i] != 1f) {
295+
query = new BoostQuery(query, boosts[i]);
307296
}
308-
query.add(termQuery, BooleanClause.Occur.SHOULD);
297+
booleanQueryBuilder.add(query, BooleanClause.Occur.SHOULD);
309298
}
310-
return query.build();
299+
return booleanQueryBuilder.build();
311300
}
312301
};
313302
}
@@ -321,16 +310,16 @@ protected Query topLevelQuery(Term[] terms, TermContext[] ctx, int[] docFreqs, i
321310
BooleanQuery.Builder lowBuilder = new BooleanQuery.Builder();
322311
lowBuilder.setDisableCoord(disableCoord);
323312
for (int i = 0; i < terms.length; i++) {
324-
TermQuery termQuery = new TermQuery(terms[i], ctx[i]);
325-
if (boosts != null) {
326-
termQuery.setBoost(boosts[i]);
313+
Query query = new TermQuery(terms[i], ctx[i]);
314+
if (boosts != null && boosts[i] != 1f) {
315+
query = new BoostQuery(query, boosts[i]);
327316
}
328317
if ((maxTermFrequency >= 1f && docFreqs[i] > maxTermFrequency)
329318
|| (docFreqs[i] > (int) Math.ceil(maxTermFrequency
330319
* (float) maxDoc))) {
331-
highBuilder.add(termQuery, BooleanClause.Occur.SHOULD);
320+
highBuilder.add(query, BooleanClause.Occur.SHOULD);
332321
} else {
333-
lowBuilder.add(termQuery, BooleanClause.Occur.SHOULD);
322+
lowBuilder.add(query, BooleanClause.Occur.SHOULD);
334323
}
335324
}
336325
BooleanQuery high = highBuilder.build();
@@ -363,15 +352,15 @@ public static BlendedTermQuery dismaxBlendedQuery(Term[] terms, final float[] bo
363352
return new BlendedTermQuery(terms, boosts) {
364353
@Override
365354
protected Query topLevelQuery(Term[] terms, TermContext[] ctx, int[] docFreqs, int maxDoc) {
366-
DisjunctionMaxQuery query = new DisjunctionMaxQuery(tieBreakerMultiplier);
355+
DisjunctionMaxQuery disMaxQuery = new DisjunctionMaxQuery(tieBreakerMultiplier);
367356
for (int i = 0; i < terms.length; i++) {
368-
TermQuery termQuery = new TermQuery(terms[i], ctx[i]);
369-
if (boosts != null) {
370-
termQuery.setBoost(boosts[i]);
357+
Query query = new TermQuery(terms[i], ctx[i]);
358+
if (boosts != null && boosts[i] != 1f) {
359+
query = new BoostQuery(query, boosts[i]);
371360
}
372-
query.add(termQuery);
361+
disMaxQuery.add(query);
373362
}
374-
return query;
363+
return disMaxQuery;
375364
}
376365
};
377366
}

core/src/main/java/org/apache/lucene/queries/MinDocQuery.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.apache.lucene.search.Weight;
3030

3131
import java.io.IOException;
32+
import java.util.Objects;
3233

3334
/** A {@link Query} that only matches documents that are greater than or equal
3435
* to a configured doc ID. */
@@ -43,7 +44,7 @@ public MinDocQuery(int minDoc) {
4344

4445
@Override
4546
public int hashCode() {
46-
return 31 * super.hashCode() + minDoc;
47+
return Objects.hash(super.hashCode(), minDoc);
4748
}
4849

4950
@Override

core/src/main/java/org/apache/lucene/queryparser/classic/MapperQueryParser.java

Lines changed: 25 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,7 @@
2323
import org.apache.lucene.analysis.TokenStream;
2424
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
2525
import org.apache.lucene.index.Term;
26-
import org.apache.lucene.search.BooleanClause;
27-
import org.apache.lucene.search.DisjunctionMaxQuery;
28-
import org.apache.lucene.search.FuzzyQuery;
29-
import org.apache.lucene.search.MatchNoDocsQuery;
30-
import org.apache.lucene.search.MultiPhraseQuery;
31-
import org.apache.lucene.search.PhraseQuery;
32-
import org.apache.lucene.search.Query;
26+
import org.apache.lucene.search.*;
3327
import org.apache.lucene.util.IOUtils;
3428
import org.apache.lucene.util.automaton.RegExp;
3529
import org.elasticsearch.common.lucene.search.Queries;
@@ -41,12 +35,7 @@
4135
import org.elasticsearch.index.query.support.QueryParsers;
4236

4337
import java.io.IOException;
44-
import java.util.ArrayList;
45-
import java.util.Collection;
46-
import java.util.HashMap;
47-
import java.util.List;
48-
import java.util.Map;
49-
import java.util.Objects;
38+
import java.util.*;
5039

5140
import static java.util.Collections.unmodifiableMap;
5241
import static org.elasticsearch.common.lucene.search.Queries.fixNegativeQueryIfNeeded;
@@ -148,8 +137,7 @@ public Query getFieldQuery(String field, String queryText, boolean quoted) throw
148137
Query q = getFieldQuerySingle(mField, queryText, quoted);
149138
if (q != null) {
150139
added = true;
151-
applyBoost(mField, q);
152-
disMaxQuery.add(q);
140+
disMaxQuery.add(applyBoost(mField, q));
153141
}
154142
}
155143
if (!added) {
@@ -161,8 +149,7 @@ public Query getFieldQuery(String field, String queryText, boolean quoted) throw
161149
for (String mField : fields) {
162150
Query q = getFieldQuerySingle(mField, queryText, quoted);
163151
if (q != null) {
164-
applyBoost(mField, q);
165-
clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
152+
clauses.add(new BooleanClause(applyBoost(mField, q), BooleanClause.Occur.SHOULD));
166153
}
167154
}
168155
if (clauses.size() == 0) // happens for stopwords
@@ -250,9 +237,8 @@ protected Query getFieldQuery(String field, String queryText, int slop) throws P
250237
Query q = super.getFieldQuery(mField, queryText, slop);
251238
if (q != null) {
252239
added = true;
253-
applyBoost(mField, q);
254240
q = applySlop(q, slop);
255-
disMaxQuery.add(q);
241+
disMaxQuery.add(applyBoost(mField, q));
256242
}
257243
}
258244
if (!added) {
@@ -264,9 +250,8 @@ protected Query getFieldQuery(String field, String queryText, int slop) throws P
264250
for (String mField : fields) {
265251
Query q = super.getFieldQuery(mField, queryText, slop);
266252
if (q != null) {
267-
applyBoost(mField, q);
268253
q = applySlop(q, slop);
269-
clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
254+
clauses.add(new BooleanClause(applyBoost(mField, q), BooleanClause.Occur.SHOULD));
270255
}
271256
}
272257
if (clauses.size() == 0) // happens for stopwords
@@ -305,8 +290,7 @@ protected Query getRangeQuery(String field, String part1, String part2, boolean
305290
Query q = getRangeQuerySingle(mField, part1, part2, startInclusive, endInclusive);
306291
if (q != null) {
307292
added = true;
308-
applyBoost(mField, q);
309-
disMaxQuery.add(q);
293+
disMaxQuery.add(applyBoost(mField, q));
310294
}
311295
}
312296
if (!added) {
@@ -318,8 +302,7 @@ protected Query getRangeQuery(String field, String part1, String part2, boolean
318302
for (String mField : fields) {
319303
Query q = getRangeQuerySingle(mField, part1, part2, startInclusive, endInclusive);
320304
if (q != null) {
321-
applyBoost(mField, q);
322-
clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
305+
clauses.add(new BooleanClause(applyBoost(mField, q), BooleanClause.Occur.SHOULD));
323306
}
324307
}
325308
if (clauses.size() == 0) // happens for stopwords
@@ -371,8 +354,7 @@ protected Query getFuzzyQuery(String field, String termStr, String minSimilarity
371354
Query q = getFuzzyQuerySingle(mField, termStr, minSimilarity);
372355
if (q != null) {
373356
added = true;
374-
applyBoost(mField, q);
375-
disMaxQuery.add(q);
357+
disMaxQuery.add(applyBoost(mField, q));
376358
}
377359
}
378360
if (!added) {
@@ -383,8 +365,9 @@ protected Query getFuzzyQuery(String field, String termStr, String minSimilarity
383365
List<BooleanClause> clauses = new ArrayList<>();
384366
for (String mField : fields) {
385367
Query q = getFuzzyQuerySingle(mField, termStr, minSimilarity);
386-
applyBoost(mField, q);
387-
clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
368+
if (q != null) {
369+
clauses.add(new BooleanClause(applyBoost(mField, q), BooleanClause.Occur.SHOULD));
370+
}
388371
}
389372
return getBooleanQuery(clauses, true);
390373
}
@@ -434,8 +417,7 @@ protected Query getPrefixQuery(String field, String termStr) throws ParseExcepti
434417
Query q = getPrefixQuerySingle(mField, termStr);
435418
if (q != null) {
436419
added = true;
437-
applyBoost(mField, q);
438-
disMaxQuery.add(q);
420+
disMaxQuery.add(applyBoost(mField, q));
439421
}
440422
}
441423
if (!added) {
@@ -447,8 +429,7 @@ protected Query getPrefixQuery(String field, String termStr) throws ParseExcepti
447429
for (String mField : fields) {
448430
Query q = getPrefixQuerySingle(mField, termStr);
449431
if (q != null) {
450-
applyBoost(mField, q);
451-
clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
432+
clauses.add(new BooleanClause(applyBoost(mField, q), BooleanClause.Occur.SHOULD));
452433
}
453434
}
454435
if (clauses.size() == 0) // happens for stopwords
@@ -566,8 +547,7 @@ protected Query getWildcardQuery(String field, String termStr) throws ParseExcep
566547
Query q = getWildcardQuerySingle(mField, termStr);
567548
if (q != null) {
568549
added = true;
569-
applyBoost(mField, q);
570-
disMaxQuery.add(q);
550+
disMaxQuery.add(applyBoost(mField, q));
571551
}
572552
}
573553
if (!added) {
@@ -579,8 +559,7 @@ protected Query getWildcardQuery(String field, String termStr) throws ParseExcep
579559
for (String mField : fields) {
580560
Query q = getWildcardQuerySingle(mField, termStr);
581561
if (q != null) {
582-
applyBoost(mField, q);
583-
clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
562+
clauses.add(new BooleanClause(applyBoost(mField, q), BooleanClause.Occur.SHOULD));
584563
}
585564
}
586565
if (clauses.size() == 0) // happens for stopwords
@@ -697,8 +676,7 @@ protected Query getRegexpQuery(String field, String termStr) throws ParseExcepti
697676
Query q = getRegexpQuerySingle(mField, termStr);
698677
if (q != null) {
699678
added = true;
700-
applyBoost(mField, q);
701-
disMaxQuery.add(q);
679+
disMaxQuery.add(applyBoost(mField, q));
702680
}
703681
}
704682
if (!added) {
@@ -710,8 +688,7 @@ protected Query getRegexpQuery(String field, String termStr) throws ParseExcepti
710688
for (String mField : fields) {
711689
Query q = getRegexpQuerySingle(mField, termStr);
712690
if (q != null) {
713-
applyBoost(mField, q);
714-
clauses.add(new BooleanClause(q, BooleanClause.Occur.SHOULD));
691+
clauses.add(new BooleanClause(applyBoost(mField, q), BooleanClause.Occur.SHOULD));
715692
}
716693
}
717694
if (clauses.size() == 0) // happens for stopwords
@@ -761,11 +738,12 @@ protected Query getBooleanQuery(List<BooleanClause> clauses, boolean disableCoor
761738
return fixNegativeQueryIfNeeded(q);
762739
}
763740

764-
private void applyBoost(String field, Query q) {
741+
private Query applyBoost(String field, Query q) {
765742
Float fieldBoost = settings.fieldsAndWeights().get(field);
766-
if (fieldBoost != null) {
767-
q.setBoost(fieldBoost);
743+
if (fieldBoost != null && fieldBoost != 1f) {
744+
return new BoostQuery(q, fieldBoost);
768745
}
746+
return q;
769747
}
770748

771749
private Query applySlop(Query q, int slop) {
@@ -779,7 +757,9 @@ private Query applySlop(Query q, int slop) {
779757
builder.add(terms[i], positions[i]);
780758
}
781759
pq = builder.build();
782-
pq.setBoost(q.getBoost());
760+
//make sure that the boost hasn't been set beforehand, otherwise we'd lose it
761+
assert q.getBoost() == 1f;
762+
assert q instanceof BoostQuery == false;
783763
return pq;
784764
} else if (q instanceof MultiPhraseQuery) {
785765
((MultiPhraseQuery) q).setSlop(slop);

core/src/main/java/org/apache/lucene/search/vectorhighlight/CustomFieldQuery.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,7 @@
2222
import org.apache.lucene.index.IndexReader;
2323
import org.apache.lucene.index.Term;
2424
import org.apache.lucene.queries.BlendedTermQuery;
25-
import org.apache.lucene.search.ConstantScoreQuery;
26-
import org.apache.lucene.search.MultiPhraseQuery;
27-
import org.apache.lucene.search.PhraseQuery;
28-
import org.apache.lucene.search.Query;
29-
import org.apache.lucene.search.TermQuery;
25+
import org.apache.lucene.search.*;
3026
import org.apache.lucene.search.spans.SpanTermQuery;
3127
import org.elasticsearch.common.lucene.search.MultiPhrasePrefixQuery;
3228
import org.elasticsearch.common.lucene.search.function.FiltersFunctionScoreQuery;
@@ -103,8 +99,7 @@ private void convertMultiPhraseQuery(int currentPos, int[] termsIdx, MultiPhrase
10399
for (int i = 0; i < termsIdx.length; i++) {
104100
queryBuilder.add(terms.get(i)[termsIdx[i]], pos[i]);
105101
}
106-
PhraseQuery query = queryBuilder.build();
107-
query.setBoost(orig.getBoost());
102+
Query query = queryBuilder.build();
108103
this.flatten(query, reader, flatQueries, orig.getBoost());
109104
} else {
110105
Term[] t = terms.get(currentPos);

0 commit comments

Comments
 (0)