Skip to content

Commit 7eedd84

Browse files
committed
Query refactoring: refactor query_string query and score functions
Refactor the function_score query so it can be parsed on the coordinating node, split parse into fromXContent and toQuery, make FunctionScoreQueryBuilder Writeable. Closes #13653
1 parent 6350470 commit 7eedd84

File tree

67 files changed

+3501
-1637
lines changed

Some content is hidden

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

67 files changed

+3501
-1637
lines changed

core/src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilder.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@
2727
import com.vividsolutions.jts.geom.Geometry;
2828
import com.vividsolutions.jts.geom.GeometryFactory;
2929
import org.elasticsearch.ElasticsearchParseException;
30+
import org.elasticsearch.action.support.ToXContentToBytes;
3031
import org.elasticsearch.common.logging.ESLogger;
3132
import org.elasticsearch.common.logging.ESLoggerFactory;
3233
import org.elasticsearch.common.unit.DistanceUnit.Distance;
3334
import org.elasticsearch.common.xcontent.ToXContent;
3435
import org.elasticsearch.common.xcontent.XContent;
3536
import org.elasticsearch.common.xcontent.XContentBuilder;
3637
import org.elasticsearch.common.xcontent.XContentParser;
37-
import org.elasticsearch.common.xcontent.json.JsonXContent;
3838
import org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper;
3939

4040
import java.io.IOException;
@@ -43,7 +43,7 @@
4343
/**
4444
* Basic class for building GeoJSON shapes like Polygons, Linestrings, etc
4545
*/
46-
public abstract class ShapeBuilder implements ToXContent {
46+
public abstract class ShapeBuilder extends ToXContentToBytes {
4747

4848
protected static final ESLogger LOGGER = ESLoggerFactory.getLogger(ShapeBuilder.class.getName());
4949

@@ -209,16 +209,6 @@ public static CircleBuilder newCircleBuilder() {
209209
*/
210210
public static EnvelopeBuilder newEnvelope(Orientation orientation) { return new EnvelopeBuilder(orientation); }
211211

212-
@Override
213-
public String toString() {
214-
try {
215-
XContentBuilder xcontent = JsonXContent.contentBuilder();
216-
return toXContent(xcontent, EMPTY_PARAMS).prettyPrint().string();
217-
} catch (IOException e) {
218-
return super.toString();
219-
}
220-
}
221-
222212
/**
223213
* Create a new Shape from this builder. Since calling this method could change the
224214
* defined shape. (by inserting new coordinates or change the position of points)

core/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.elasticsearch.common.text.StringAndBytesText;
3535
import org.elasticsearch.common.text.Text;
3636
import org.elasticsearch.index.query.QueryBuilder;
37+
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder;
3738
import org.joda.time.DateTime;
3839
import org.joda.time.DateTimeZone;
3940

@@ -586,6 +587,13 @@ public QueryBuilder readQuery() throws IOException {
586587
return readNamedWriteable(QueryBuilder.class);
587588
}
588589

590+
/**
591+
* Reads a {@link org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder} from the current stream
592+
*/
593+
public ScoreFunctionBuilder<?> readScoreFunction() throws IOException {
594+
return readNamedWriteable(ScoreFunctionBuilder.class);
595+
}
596+
589597
public static StreamInput wrap(BytesReference reference) {
590598
if (reference.hasArray() == false) {
591599
reference = reference.toBytesArray();

core/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.common.bytes.BytesReference;
3333
import org.elasticsearch.common.text.Text;
3434
import org.elasticsearch.index.query.QueryBuilder;
35+
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilder;
3536
import org.joda.time.ReadableInstant;
3637

3738
import java.io.EOFException;
@@ -588,4 +589,11 @@ void writeNamedWriteable(NamedWriteable namedWriteable) throws IOException {
588589
public void writeQuery(QueryBuilder queryBuilder) throws IOException {
589590
writeNamedWriteable(queryBuilder);
590591
}
592+
593+
/**
594+
* Writes a {@link ScoreFunctionBuilder} to the current stream
595+
*/
596+
public void writeScoreFunction(ScoreFunctionBuilder<?> scoreFunctionBuilder) throws IOException {
597+
writeNamedWriteable(scoreFunctionBuilder);
598+
}
591599
}

core/src/main/java/org/elasticsearch/common/lucene/search/function/CombineFunction.java

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,20 @@
2020
package org.elasticsearch.common.lucene.search.function;
2121

2222
import org.apache.lucene.search.Explanation;
23+
import org.elasticsearch.common.io.stream.StreamInput;
24+
import org.elasticsearch.common.io.stream.StreamOutput;
25+
import org.elasticsearch.common.io.stream.Writeable;
2326

24-
public enum CombineFunction {
25-
MULT {
27+
import java.io.IOException;
28+
import java.util.Locale;
29+
30+
public enum CombineFunction implements Writeable<CombineFunction> {
31+
MULTIPLY {
2632
@Override
2733
public float combine(double queryScore, double funcScore, double maxBoost) {
2834
return toFloat(queryScore * Math.min(funcScore, maxBoost));
2935
}
3036

31-
@Override
32-
public String getName() {
33-
return "multiply";
34-
}
35-
3637
@Override
3738
public Explanation explain(Explanation queryExpl, Explanation funcExpl, float maxBoost) {
3839
Explanation boostExpl = Explanation.match(maxBoost, "maxBoost");
@@ -50,11 +51,6 @@ public float combine(double queryScore, double funcScore, double maxBoost) {
5051
return toFloat(Math.min(funcScore, maxBoost));
5152
}
5253

53-
@Override
54-
public String getName() {
55-
return "replace";
56-
}
57-
5854
@Override
5955
public Explanation explain(Explanation queryExpl, Explanation funcExpl, float maxBoost) {
6056
Explanation boostExpl = Explanation.match(maxBoost, "maxBoost");
@@ -71,11 +67,6 @@ public float combine(double queryScore, double funcScore, double maxBoost) {
7167
return toFloat(queryScore + Math.min(funcScore, maxBoost));
7268
}
7369

74-
@Override
75-
public String getName() {
76-
return "sum";
77-
}
78-
7970
@Override
8071
public Explanation explain(Explanation queryExpl, Explanation funcExpl, float maxBoost) {
8172
Explanation minExpl = Explanation.match(Math.min(funcExpl.getValue(), maxBoost), "min of:",
@@ -91,11 +82,6 @@ public float combine(double queryScore, double funcScore, double maxBoost) {
9182
return toFloat((Math.min(funcScore, maxBoost) + queryScore) / 2.0);
9283
}
9384

94-
@Override
95-
public String getName() {
96-
return "avg";
97-
}
98-
9985
@Override
10086
public Explanation explain(Explanation queryExpl, Explanation funcExpl, float maxBoost) {
10187
Explanation minExpl = Explanation.match(Math.min(funcExpl.getValue(), maxBoost), "min of:",
@@ -112,11 +98,6 @@ public float combine(double queryScore, double funcScore, double maxBoost) {
11298
return toFloat(Math.min(queryScore, Math.min(funcScore, maxBoost)));
11399
}
114100

115-
@Override
116-
public String getName() {
117-
return "min";
118-
}
119-
120101
@Override
121102
public Explanation explain(Explanation queryExpl, Explanation funcExpl, float maxBoost) {
122103
Explanation innerMinExpl = Explanation.match(
@@ -134,11 +115,6 @@ public float combine(double queryScore, double funcScore, double maxBoost) {
134115
return toFloat(Math.max(queryScore, Math.min(funcScore, maxBoost)));
135116
}
136117

137-
@Override
138-
public String getName() {
139-
return "max";
140-
}
141-
142118
@Override
143119
public Explanation explain(Explanation queryExpl, Explanation funcExpl, float maxBoost) {
144120
Explanation innerMinExpl = Explanation.match(
@@ -153,8 +129,6 @@ public Explanation explain(Explanation queryExpl, Explanation funcExpl, float ma
153129

154130
public abstract float combine(double queryScore, double funcScore, double maxBoost);
155131

156-
public abstract String getName();
157-
158132
public static float toFloat(double input) {
159133
assert deviation(input) <= 0.001 : "input " + input + " out of float scope for function score deviation: " + deviation(input);
160134
return (float) input;
@@ -166,4 +140,26 @@ private static double deviation(double input) { // only with assert!
166140
}
167141

168142
public abstract Explanation explain(Explanation queryExpl, Explanation funcExpl, float maxBoost);
143+
144+
@Override
145+
public void writeTo(StreamOutput out) throws IOException {
146+
out.writeVInt(this.ordinal());
147+
}
148+
149+
@Override
150+
public CombineFunction readFrom(StreamInput in) throws IOException {
151+
int ordinal = in.readVInt();
152+
if (ordinal < 0 || ordinal >= values().length) {
153+
throw new IOException("Unknown CombineFunction ordinal [" + ordinal + "]");
154+
}
155+
return values()[ordinal];
156+
}
157+
158+
public static CombineFunction readCombineFunctionFrom(StreamInput in) throws IOException {
159+
return CombineFunction.MULTIPLY.readFrom(in);
160+
}
161+
162+
public static CombineFunction fromString(String combineFunction) {
163+
return valueOf(combineFunction.toUpperCase(Locale.ROOT));
164+
}
169165
}

core/src/main/java/org/elasticsearch/common/lucene/search/function/FieldValueFactorFunction.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,16 @@
2222
import org.apache.lucene.index.LeafReaderContext;
2323
import org.apache.lucene.search.Explanation;
2424
import org.elasticsearch.ElasticsearchException;
25+
import org.elasticsearch.common.io.stream.StreamInput;
26+
import org.elasticsearch.common.io.stream.StreamOutput;
27+
import org.elasticsearch.common.io.stream.Writeable;
2528
import org.elasticsearch.index.fielddata.FieldData;
2629
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
2730
import org.elasticsearch.index.fielddata.SortedNumericDoubleValues;
2831

32+
import java.io.IOException;
2933
import java.util.Locale;
34+
import java.util.Objects;
3035

3136
/**
3237
* A function_score function that multiplies the score with the value of a
@@ -45,7 +50,7 @@ public class FieldValueFactorFunction extends ScoreFunction {
4550

4651
public FieldValueFactorFunction(String field, float boostFactor, Modifier modifierType, Double missing,
4752
IndexNumericFieldData indexFieldData) {
48-
super(CombineFunction.MULT);
53+
super(CombineFunction.MULTIPLY);
4954
this.field = field;
5055
this.boostFactor = boostFactor;
5156
this.modifier = modifierType;
@@ -103,11 +108,19 @@ public boolean needsScores() {
103108
return false;
104109
}
105110

111+
@Override
112+
protected boolean doEquals(ScoreFunction other) {
113+
FieldValueFactorFunction fieldValueFactorFunction = (FieldValueFactorFunction) other;
114+
return this.boostFactor == fieldValueFactorFunction.boostFactor &&
115+
Objects.equals(this.field, fieldValueFactorFunction.field) &&
116+
Objects.equals(this.modifier, fieldValueFactorFunction.modifier);
117+
}
118+
106119
/**
107120
* The Type class encapsulates the modification types that can be applied
108121
* to the score/value product.
109122
*/
110-
public enum Modifier {
123+
public enum Modifier implements Writeable<Modifier> {
111124
NONE {
112125
@Override
113126
public double apply(double n) {
@@ -171,9 +184,31 @@ public double apply(double n) {
171184

172185
public abstract double apply(double n);
173186

187+
@Override
188+
public void writeTo(StreamOutput out) throws IOException {
189+
out.writeVInt(this.ordinal());
190+
}
191+
192+
public static Modifier readModifierFrom(StreamInput in) throws IOException {
193+
return Modifier.NONE.readFrom(in);
194+
}
195+
196+
@Override
197+
public Modifier readFrom(StreamInput in) throws IOException {
198+
int ordinal = in.readVInt();
199+
if (ordinal < 0 || ordinal >= values().length) {
200+
throw new IOException("Unknown Modifier ordinal [" + ordinal + "]");
201+
}
202+
return values()[ordinal];
203+
}
204+
174205
@Override
175206
public String toString() {
176207
return super.toString().toLowerCase(Locale.ROOT);
177208
}
209+
210+
public static Modifier fromString(String modifier) {
211+
return valueOf(modifier.toUpperCase(Locale.ROOT));
212+
}
178213
}
179214
}

0 commit comments

Comments
 (0)