Skip to content

Commit 1aad3e8

Browse files
authored
Merge pull request #2258 from elastic/feature/custom-similarity
fix #2178, can now add custom similarities using both fluent and ois …
2 parents c8e4824 + f7bd557 commit 1aad3e8

File tree

6 files changed

+62
-8
lines changed

6 files changed

+62
-8
lines changed

src/Nest/CommonAbstractions/DictionaryLike/IsADictionaryBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ public abstract class IsADictionaryBase<TKey, TValue> : IIsADictionary<TKey, TVa
1414
//protected IsADictionaryBase(Dictionary<TKey, TValue> backingDictionary) { this.BackingDictionary = backingDictionary; }
1515
protected IsADictionaryBase(IDictionary<TKey, TValue> backingDictionary)
1616
{
17-
this.BackingDictionary = backingDictionary != null
18-
? new Dictionary<TKey, TValue>(backingDictionary)
17+
this.BackingDictionary = backingDictionary != null
18+
? new Dictionary<TKey, TValue>(backingDictionary)
1919
: new Dictionary<TKey, TValue>();
2020
}
2121

@@ -79,4 +79,4 @@ public TValue this[TKey key]
7979
}
8080

8181

82-
}
82+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Newtonsoft.Json;
4+
5+
namespace Nest
6+
{
7+
public interface ICustomSimilarity : ISimilarity, IIsADictionary<string, object> { }
8+
9+
/// <inheritdoc/>
10+
public class CustomSimilarity : IsADictionaryBase<string, object>, ICustomSimilarity
11+
{
12+
public string Type { get { return this["type"] as string; } set { this.Add("type", value); } }
13+
14+
public CustomSimilarity(string type) : base()
15+
{
16+
if (!string.IsNullOrEmpty(type)) this.Type = type;
17+
}
18+
internal CustomSimilarity(IDictionary<string, object> container) : base(container) { }
19+
internal CustomSimilarity(Dictionary<string, object> container)
20+
: base(container.Select(kv => kv).ToDictionary(kv => kv.Key, kv => kv.Value))
21+
{ }
22+
23+
public void Add(string key, object value) => BackingDictionary.Add(key, value);
24+
}
25+
/// <inheritdoc/>
26+
public class CustomSimilarityDescriptor
27+
: IsADictionaryDescriptorBase<CustomSimilarityDescriptor, ICustomSimilarity, string, object>
28+
{
29+
30+
public CustomSimilarityDescriptor() : base(new CustomSimilarity(string.Empty)) { }
31+
32+
internal CustomSimilarityDescriptor Type(string type) => Assign("type", type);
33+
public CustomSimilarityDescriptor Add(string key, object value) => Assign(key, value);
34+
}
35+
36+
}

src/Nest/IndexModules/Similarity/Similarities.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public Similarities(Dictionary<string, ISimilarity> container)
2222
public void Add(string type, ISimilarity mapping) => BackingDictionary.Add(type, mapping);
2323

2424
}
25-
25+
2626
public class SimilaritiesDescriptor : IsADictionaryDescriptorBase<SimilaritiesDescriptor, ISimilarities, string, ISimilarity>
2727
{
2828
public SimilaritiesDescriptor() : base(new Similarities()) { }
@@ -33,6 +33,8 @@ public SimilaritiesDescriptor() : base(new Similarities()) { }
3333
public SimilaritiesDescriptor LMJelinek(string name, Func<LMJelinekMercerSimilarityDescriptor, ILMJelinekMercerSimilarity> selector) => Assign(name, selector?.Invoke(new LMJelinekMercerSimilarityDescriptor()));
3434
public SimilaritiesDescriptor DFR(string name, Func<DFRSimilarityDescriptor, IDFRSimilarity> selector) => Assign(name, selector?.Invoke(new DFRSimilarityDescriptor()));
3535
public SimilaritiesDescriptor IB(string name, Func<IBSimilarityDescriptor, IIBSimilarity> selector) => Assign(name, selector?.Invoke(new IBSimilarityDescriptor()));
36+
public SimilaritiesDescriptor Custom(string name, string type, Func<CustomSimilarityDescriptor, IPromise<ICustomSimilarity>> selector) =>
37+
Assign(name, selector?.Invoke(new CustomSimilarityDescriptor().Type(type))?.Value);
3638
}
3739

3840
}

src/Nest/IndexModules/Similarity/SimilarityJsonConverter.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Newtonsoft.Json;
33
using Newtonsoft.Json.Linq;
44
using System.Reflection;
5+
using System.Collections.Generic;
56

67
namespace Nest
78
{
@@ -20,7 +21,10 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
2021

2122
var typePropertyValue = typeProperty.Value.ToString();
2223
var itemType = Type.GetType("Nest." + typePropertyValue + "Similarity", false, true);
23-
return o.ToObject(itemType, ElasticContractResolver.Empty);
24+
if (itemType != null) return o.ToObject(itemType, ElasticContractResolver.Empty);
25+
26+
var dict = o.ToObject<Dictionary<string, object>>();
27+
return new CustomSimilarity(dict);
2428
}
2529

2630
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

src/Nest/Nest.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@
609609
<Compile Include="IndexModules\IndexSettings\Translog\TranslogFlushSettings.cs" />
610610
<Compile Include="IndexModules\IndexSettings\Translog\TranslogSettings.cs" />
611611
<Compile Include="IndexModules\IndexSettings\Translog\TranslogWriteMode.cs" />
612+
<Compile Include="IndexModules\Similarity\CustomSimilarity.cs" />
612613
<Compile Include="IndexModules\Similarity\BM25Similarity.cs" />
613614
<Compile Include="IndexModules\Similarity\DefaultSimilarity.cs" />
614615
<Compile Include="IndexModules\Similarity\DFR\DFRAfterEffect.cs" />

src/Tests/IndexModules/Similarity/SimilaritySettings.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,16 @@ public class Usage : PromiseUsageTestBase<ISimilarities, SimilaritiesDescriptor,
4949
{
5050
lambda = 2.0,
5151
type = "LMJelinekMercer"
52+
},
53+
my_name = new
54+
{
55+
type = "plugin_sim",
56+
some_property = "some value"
5257
}
5358
};
5459

5560
/**
56-
*
61+
*
5762
*/
5863
protected override Func<SimilaritiesDescriptor, IPromise<ISimilarities>> Fluent => s => s
5964
.BM25("bm25", b => b
@@ -73,7 +78,10 @@ public class Usage : PromiseUsageTestBase<ISimilarities, SimilaritiesDescriptor,
7378
.Distribution(IBDistribution.LogLogistic)
7479
)
7580
.LMDirichlet("lmd", d => d.Mu(2))
76-
.LMJelinek("lmj", d => d.Lamdba(2.0));
81+
.LMJelinek("lmj", d => d.Lamdba(2.0))
82+
.Custom("my_name", "plugin_sim", d => d
83+
.Add("some_property", "some value")
84+
);
7785
/**
7886
*/
7987
protected override Similarities Initializer =>
@@ -96,7 +104,10 @@ public class Usage : PromiseUsageTestBase<ISimilarities, SimilaritiesDescriptor,
96104
NormalizationH1C = 1.2
97105
} },
98106
{ "lmd", new LMDirichletSimilarity { Mu = 2 } },
99-
{ "lmj", new LMJelinekMercerSimilarity { Lambda = 2.0 } }
107+
{ "lmj", new LMJelinekMercerSimilarity { Lambda = 2.0 } },
108+
{ "my_name", new CustomSimilarity("plugin_sim") {
109+
{ "some_property", "some value" }
110+
} }
100111
};
101112
}
102113
}

0 commit comments

Comments
 (0)