Skip to content

Commit caabf36

Browse files
committed
Merge pull request #799 from elasticsearch/fix/function-score
Fix/function score
2 parents cc201d8 + 3c43967 commit caabf36

13 files changed

+180
-83
lines changed

src/Nest/DSL/Query/FunctionScoreQueryDescriptor.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ public interface IFunctionScoreQuery : IQuery
2727
[JsonConverter(typeof (StringEnumConverter))]
2828
FunctionBoostMode? BoostMode { get; set; }
2929

30+
[JsonProperty("max_boost")]
31+
float? MaxBoost { get; set; }
32+
3033
[JsonProperty(PropertyName = "random_score")]
3134
IRandomScoreFunction RandomScore { get; set; }
3235

@@ -46,6 +49,7 @@ protected override void WrapInContainer(IQueryContainer container)
4649
public IQueryContainer Query { get; set; }
4750
public FunctionScoreMode? ScoreMode { get; set; }
4851
public FunctionBoostMode? BoostMode { get; set; }
52+
public float? MaxBoost { get; set; }
4953
public IRandomScoreFunction RandomScore { get; set; }
5054
public IScriptFilter ScriptScore { get; set; }
5155
}
@@ -60,6 +64,8 @@ public class FunctionScoreQueryDescriptor<T> : IFunctionScoreQuery where T : cla
6064

6165
FunctionBoostMode? IFunctionScoreQuery.BoostMode { get; set; }
6266

67+
float? IFunctionScoreQuery.MaxBoost { get; set; }
68+
6369
IRandomScoreFunction IFunctionScoreQuery.RandomScore { get; set; }
6470

6571
IScriptFilter IFunctionScoreQuery.ScriptScore { get; set; }
@@ -110,6 +116,12 @@ public FunctionScoreQueryDescriptor<T> BoostMode(FunctionBoostMode mode)
110116
return this;
111117
}
112118

119+
public FunctionScoreQueryDescriptor<T> MaxBoost(float maxBoost)
120+
{
121+
((IFunctionScoreQuery)this).MaxBoost = maxBoost;
122+
return this;
123+
}
124+
113125
public FunctionScoreQueryDescriptor<T> RandomScore(int? seed = null)
114126
{
115127
((IFunctionScoreQuery)this).RandomScore = new RandomScoreFunction();

src/Nest/DSL/Query/Functions/BoostFactorFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Nest
44
{
55
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
6-
public class BoostFactorFunction<T> : FunctionScoreFilteredFunction<T> where T : class
6+
public class BoostFactorFunction<T> : FunctionScoreFunction<T> where T : class
77
{
88
[JsonProperty(PropertyName = "boost_factor")]
99
internal double _BoostFactor { get; set; }

src/Nest/DSL/Query/Functions/ExpFunction.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,14 @@ public ExpFunction(Expression<Func<T, object>> objectPath, Action<FunctionScoreD
2121
descriptorBuilder(descriptor);
2222
_ExpDescriptor[objectPath] = descriptor;
2323
}
24+
25+
public ExpFunction(string field, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
26+
{
27+
_ExpDescriptor = new Dictionary<PropertyPathMarker, FunctionScoreDecayFieldDescriptor>();
28+
29+
var descriptor = new FunctionScoreDecayFieldDescriptor();
30+
descriptorBuilder(descriptor);
31+
_ExpDescriptor[field] = descriptor;
32+
}
2433
}
2534
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Converters;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Linq.Expressions;
7+
using System.Text;
8+
9+
namespace Nest
10+
{
11+
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
12+
public class FieldValueFactor<T> : FunctionScoreFunction<T> where T : class
13+
{
14+
[JsonProperty(PropertyName = "field_value_factor")]
15+
internal FieldValueFactorDescriptor<T> _FieldValueFactor { get; set; }
16+
17+
public FieldValueFactor(Action<FieldValueFactorDescriptor<T>> descriptorBuilder)
18+
{
19+
var descriptor = new FieldValueFactorDescriptor<T>();
20+
descriptorBuilder(descriptor);
21+
if (descriptor._Field.IsConditionless())
22+
throw new DslException("Field name not set for field value factor function");
23+
24+
this._FieldValueFactor = descriptor;
25+
}
26+
}
27+
28+
public class FieldValueFactorDescriptor<T>
29+
{
30+
[JsonProperty("field")]
31+
internal PropertyPathMarker _Field { get; set; }
32+
33+
[JsonProperty("factor")]
34+
internal double? _Factor { get; set; }
35+
36+
[JsonProperty("modifier")]
37+
[JsonConverter(typeof(StringEnumConverter))]
38+
internal FieldValueFactorModifier? _Modifier { get; set; }
39+
40+
public FieldValueFactorDescriptor<T> Field(Expression<Func<T, object>> field)
41+
{
42+
this._Field = field;
43+
return this;
44+
}
45+
46+
public FieldValueFactorDescriptor<T> Factor(double factor)
47+
{
48+
this._Factor = factor;
49+
return this;
50+
}
51+
52+
public FieldValueFactorDescriptor<T> Modifier(FieldValueFactorModifier modifier)
53+
{
54+
this._Modifier = modifier;
55+
return this;
56+
}
57+
}
58+
}

src/Nest/DSL/Query/Functions/FunctionScoreFilteredFunction.cs

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

src/Nest/DSL/Query/Functions/FunctionScoreFunctionsDescriptor.cs

Lines changed: 28 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,104 +16,76 @@ public FunctionScoreFunctionsDescriptor()
1616
this._Functions = new List<FunctionScoreFunction<T>>();
1717
}
1818

19-
public FunctionScoreFunction<T> Gauss(Expression<Func<T, object>> objectPath, Action<FunctionScoreDecayFieldDescriptor> db)
19+
public FunctionScoreFunction<T> Gauss(string field, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
2020
{
21-
var fn = new GaussFunction<T>(objectPath, db);
21+
var fn = new GaussFunction<T>(field, descriptorBuilder);
2222
this._Functions.Add(fn);
2323
return fn;
2424
}
2525

26-
public FunctionScoreFunction<T> Linear(Expression<Func<T, object>> objectPath, Action<FunctionScoreDecayFieldDescriptor> db)
26+
public FunctionScoreFunction<T> Gauss(Expression<Func<T, object>> objectPath, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
2727
{
28-
var fn = new LinearFunction<T>(objectPath, db);
28+
var fn = new GaussFunction<T>(objectPath, descriptorBuilder);
2929
this._Functions.Add(fn);
3030
return fn;
3131
}
3232

33-
public FunctionScoreFunction<T> Exp(Expression<Func<T, object>> objectPath, Action<FunctionScoreDecayFieldDescriptor> db)
33+
public FunctionScoreFunction<T> Linear(string field, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
3434
{
35-
var fn = new ExpFunction<T>(objectPath, db);
35+
var fn = new LinearFunction<T>(field, descriptorBuilder);
3636
this._Functions.Add(fn);
3737
return fn;
3838
}
3939

40-
public BoostFactorFunction<T> BoostFactor(double value)
40+
public FunctionScoreFunction<T> Linear(Expression<Func<T, object>> objectPath, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
4141
{
42-
var fn = new BoostFactorFunction<T>(value);
42+
var fn = new LinearFunction<T>(objectPath, descriptorBuilder);
4343
this._Functions.Add(fn);
4444
return fn;
4545
}
4646

47-
public ScriptScoreFunction<T> ScriptScore(Action<ScriptFilterDescriptor> scriptSelector)
47+
public FunctionScoreFunction<T> Exp(string field, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
4848
{
49-
var fn = new ScriptScoreFunction<T>(scriptSelector);
49+
var fn = new ExpFunction<T>(field, descriptorBuilder);
5050
this._Functions.Add(fn);
5151
return fn;
5252
}
5353

54-
public FieldValueFactor<T> FieldValueFactor(Action<FieldValueFactorDescriptor<T>> db)
54+
public FunctionScoreFunction<T> Exp(Expression<Func<T, object>> objectPath, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
5555
{
56-
var fn = new FieldValueFactor<T>(db);
56+
var fn = new ExpFunction<T>(objectPath, descriptorBuilder);
5757
this._Functions.Add(fn);
5858
return fn;
5959
}
60-
public IEnumerator<FunctionScoreFunction<T>> GetEnumerator()
61-
{
62-
return _Functions.GetEnumerator();
63-
}
6460

65-
IEnumerator IEnumerable.GetEnumerator()
61+
public FunctionScoreFunction<T> BoostFactor(double value)
6662
{
67-
return _Functions.GetEnumerator();
63+
var fn = new BoostFactorFunction<T>(value);
64+
this._Functions.Add(fn);
65+
return fn;
6866
}
69-
}
70-
71-
72-
public class FieldValueFactorDescriptor<T>
73-
{
74-
[JsonProperty("field")]
75-
internal PropertyPathMarker _Field { get; set; }
7667

77-
[JsonProperty("factor")]
78-
internal double? _Factor { get; set; }
79-
80-
[JsonProperty("modifier")]
81-
[JsonConverter(typeof (StringEnumConverter))]
82-
internal FieldValueFactorModifier? _Modifier { get; set; }
83-
84-
public FieldValueFactorDescriptor<T> Field(Expression<Func<T, object>> field)
68+
public FunctionScoreFunction<T> ScriptScore(Action<ScriptFilterDescriptor> scriptSelector)
8569
{
86-
this._Field = field;
87-
return this;
70+
var fn = new ScriptScoreFunction<T>(scriptSelector);
71+
this._Functions.Add(fn);
72+
return fn;
8873
}
8974

90-
public FieldValueFactorDescriptor<T> Factor(double factor)
75+
public FunctionScoreFunction<T> FieldValueFactor(Action<FieldValueFactorDescriptor<T>> db)
9176
{
92-
this._Factor = factor;
93-
return this;
77+
var fn = new FieldValueFactor<T>(db);
78+
this._Functions.Add(fn);
79+
return fn;
9480
}
95-
96-
public FieldValueFactorDescriptor<T> Modifier(FieldValueFactorModifier modifier)
81+
public IEnumerator<FunctionScoreFunction<T>> GetEnumerator()
9782
{
98-
this._Modifier = modifier;
99-
return this;
83+
return _Functions.GetEnumerator();
10084
}
101-
}
102-
103-
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
104-
public class FieldValueFactor<T> : FunctionScoreFilteredFunction<T> where T : class
105-
{
106-
[JsonProperty(PropertyName = "field_value_factor")]
107-
internal FieldValueFactorDescriptor<T> _FieldValueFactor { get; set; }
10885

109-
public FieldValueFactor(Action<FieldValueFactorDescriptor<T>> descriptorBuilder)
86+
IEnumerator IEnumerable.GetEnumerator()
11087
{
111-
var descriptor = new FieldValueFactorDescriptor<T>();
112-
descriptorBuilder(descriptor);
113-
if (descriptor._Field.IsConditionless())
114-
throw new DslException("Field name not set for field value factor function");
115-
116-
this._FieldValueFactor = descriptor;
88+
return _Functions.GetEnumerator();
11789
}
11890
}
11991
}

src/Nest/DSL/Query/Functions/GaussFunction.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,14 @@ public GaussFunction(Expression<Func<T, object>> objectPath, Action<FunctionScor
2121
descriptorBuilder(descriptor);
2222
_GaussDescriptor[objectPath] = descriptor;
2323
}
24+
25+
public GaussFunction(string field, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
26+
{
27+
_GaussDescriptor = new Dictionary<PropertyPathMarker, FunctionScoreDecayFieldDescriptor>();
28+
29+
var descriptor = new FunctionScoreDecayFieldDescriptor();
30+
descriptorBuilder(descriptor);
31+
_GaussDescriptor[field] = descriptor;
32+
}
2433
}
2534
}

src/Nest/DSL/Query/Functions/IFunctionScoreFunction.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Nest.Resolvers.Converters;
22
using Newtonsoft.Json;
3+
using System;
34

45
namespace Nest
56
{
@@ -13,6 +14,17 @@ public interface IFunctionScoreFunction
1314
public class FunctionScoreFunction<T> : IFunctionScoreFunction
1415
where T : class
1516
{
16-
17+
[JsonProperty(PropertyName = "filter")]
18+
internal FilterContainer FilterDescriptor { get; set; }
19+
20+
public FunctionScoreFunction<T> Filter(Func<FilterDescriptor<T>, FilterContainer> filterSelector)
21+
{
22+
filterSelector.ThrowIfNull("filterSelector");
23+
var filter = new FilterDescriptor<T>();
24+
var f = filterSelector(filter);
25+
26+
this.FilterDescriptor = f;
27+
return this;
28+
}
1729
}
1830
}

src/Nest/DSL/Query/Functions/LinearFunction.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,14 @@ public LinearFunction(Expression<Func<T, object>> objectPath, Action<FunctionSco
2121
descriptorBuilder(descriptor);
2222
_LinearDescriptor[objectPath] = descriptor;
2323
}
24+
25+
public LinearFunction(string field, Action<FunctionScoreDecayFieldDescriptor> descriptorBuilder)
26+
{
27+
_LinearDescriptor = new Dictionary<PropertyPathMarker, FunctionScoreDecayFieldDescriptor>();
28+
29+
var descriptor = new FunctionScoreDecayFieldDescriptor();
30+
descriptorBuilder(descriptor);
31+
_LinearDescriptor[field] = descriptor;
32+
}
2433
}
2534
}

src/Nest/DSL/Query/Functions/ScriptScoreFunction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
namespace Nest
55
{
66
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
7-
public class ScriptScoreFunction<T> : FunctionScoreFilteredFunction<T> where T : class
7+
public class ScriptScoreFunction<T> : FunctionScoreFunction<T> where T : class
88
{
99
[JsonProperty(PropertyName = "script_score")]
1010
internal ScriptFilterDescriptor _ScriptScore { get; set; }

0 commit comments

Comments
 (0)