From 00c544ba8960b3a0cf8294a0dcc3893922e3f264 Mon Sep 17 00:00:00 2001 From: Mpdreamz Date: Wed, 25 Jan 2017 10:44:53 +0100 Subject: [PATCH 1/2] backported suggester smoothing to 2.x --- docs/aggregations/reserved-agg-names.asciidoc | 4 +- src/Nest/Nest.csproj | 5 ++ .../PhraseSuggester/PhraseSuggester.cs | 10 +++- .../SmoothingModel/LaplaceSmoothingModel.cs | 27 ++++++++++ .../LinearInterpolationSmoothingModel.cs | 37 ++++++++++++++ .../SmoothingModel/SmoothingModelBase.cs | 16 ++++++ .../SmoothingModel/SmoothingModelContainer.cs | 49 +++++++++++++++++++ .../StupidBackoffSmoothingModel.cs | 27 ++++++++++ 8 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LaplaceSmoothingModel.cs create mode 100644 src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LinearInterpolationSmoothingModel.cs create mode 100644 src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelBase.cs create mode 100644 src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelContainer.cs create mode 100644 src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/StupidBackoffSmoothingModel.cs diff --git a/docs/aggregations/reserved-agg-names.asciidoc b/docs/aggregations/reserved-agg-names.asciidoc index f1c24dba301..2b73c74a7a9 100644 --- a/docs/aggregations/reserved-agg-names.asciidoc +++ b/docs/aggregations/reserved-agg-names.asciidoc @@ -1,4 +1,4 @@ -:ref_current: https://www.elastic.co/guide/en/elasticsearch/reference/master +:ref_current: https://www.elastic.co/guide/en/elasticsearch/reference/2.3 :github: https://github.com/elastic/elasticsearch-net @@ -7,7 +7,7 @@ //// IMPORTANT NOTE ============== -This file has been generated from https://github.com/elastic/elasticsearch-net/tree/master/src/Tests/Aggregations/ReservedAggNames.doc.cs. +This file has been generated from https://github.com/elastic/elasticsearch-net/tree/2.x/src/Tests/Aggregations/ReservedAggNames.doc.cs. If you wish to submit a PR for any spelling mistakes, typos or grammatical errors for this file, please modify the original csharp file found at the link and submit the PR with that change. Thanks! //// diff --git a/src/Nest/Nest.csproj b/src/Nest/Nest.csproj index 121b96fadb1..475213f135a 100644 --- a/src/Nest/Nest.csproj +++ b/src/Nest/Nest.csproj @@ -1194,6 +1194,11 @@ + + + + + diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs index c070ca1cbac..0541bd5a6ac 100644 --- a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs +++ b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs @@ -32,6 +32,9 @@ public interface IPhraseSuggester : ISuggester [JsonProperty(PropertyName = "collate")] IPhraseSuggestCollate Collate { get; set; } + + [JsonProperty("smoothing")] + SmoothingModelContainer Smoothing { get; set; } } public class PhraseSuggester : SuggesterBase, IPhraseSuggester @@ -44,6 +47,7 @@ public class PhraseSuggester : SuggesterBase, IPhraseSuggester public IEnumerable DirectGenerator { get; set; } public IPhraseSuggestHighlight Highlight { get; set; } public IPhraseSuggestCollate Collate { get; set; } + public SmoothingModelContainer Smoothing { get; set; } } public class PhraseSuggesterDescriptor : SuggestDescriptorBase, IPhraseSuggester, T>, IPhraseSuggester @@ -57,6 +61,7 @@ public class PhraseSuggesterDescriptor : SuggestDescriptorBase IPhraseSuggester.DirectGenerator { get; set; } IPhraseSuggestHighlight IPhraseSuggester.Highlight { get; set; } IPhraseSuggestCollate IPhraseSuggester.Collate { get; set; } + SmoothingModelContainer IPhraseSuggester.Smoothing { get; set; } public PhraseSuggesterDescriptor GramSize(int? gramSize) => Assign(a => a.GramSize = gramSize); @@ -69,7 +74,7 @@ public class PhraseSuggesterDescriptor : SuggestDescriptorBase DirectGenerator(params Func, IDirectGenerator>[] generators) => Assign(a=>a.DirectGenerator = generators.Select(g => g(new DirectGeneratorDescriptor())).ToList()); - public PhraseSuggesterDescriptor RealWordErrorLikelihood(double? realWordErrorLikelihood) => + public PhraseSuggesterDescriptor RealWordErrorLikelihood(double? realWordErrorLikelihood) => Assign(a => a.RealWordErrorLikelihood = realWordErrorLikelihood); public PhraseSuggesterDescriptor Highlight(Func selector) => @@ -77,5 +82,8 @@ public PhraseSuggesterDescriptor Highlight(Func Collate(Func, IPhraseSuggestCollate> selector) => Assign(a => a.Collate = selector?.Invoke(new PhraseSuggestCollateDescriptor())); + + public PhraseSuggesterDescriptor Smoothing(Func selector) => + Assign(a => a.Smoothing = selector?.Invoke(new SmoothingModelContainerDescriptor())); } } diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LaplaceSmoothingModel.cs b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LaplaceSmoothingModel.cs new file mode 100644 index 00000000000..7ed4e7b3542 --- /dev/null +++ b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LaplaceSmoothingModel.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; +using System; + +namespace Nest +{ + [JsonObject] + [JsonConverter(typeof(ReadAsTypeJsonConverter))] + public interface ILaplaceSmoothingModel : ISmoothingModel + { + [JsonProperty("alpha")] + double? Alpha { get; set; } + } + + public class LaplaceSmoothingModel : SmoothingModelBase, ILaplaceSmoothingModel + { + public double? Alpha { get; set; } + + internal override void WrapInContainer(ISmoothingModelContainer container) => container.Laplace = this; + } + + public class LaplaceSmoothingModelDescriptor : DescriptorBase, ILaplaceSmoothingModel + { + double? ILaplaceSmoothingModel.Alpha{ get; set; } + + public LaplaceSmoothingModelDescriptor Alpha(double? alpha) => Assign(a => a.Alpha = alpha); + } +} diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LinearInterpolationSmoothingModel.cs b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LinearInterpolationSmoothingModel.cs new file mode 100644 index 00000000000..4fe2a6f063c --- /dev/null +++ b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/LinearInterpolationSmoothingModel.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json; +using System; + +namespace Nest +{ + [JsonObject] + [JsonConverter(typeof(ReadAsTypeJsonConverter))] + public interface ILinearInterpolationSmoothingModel : ISmoothingModel + { + [JsonProperty("trigram_lambda")] + double TrigramLambda { get; set; } + [JsonProperty("bigram_lambda")] + double BigramLambda { get; set; } + [JsonProperty("unigram_lambda")] + double UnigramLambda { get; set; } + } + + public class LinearInterpolationSmoothingModel : SmoothingModelBase, ILinearInterpolationSmoothingModel + { + public double TrigramLambda { get; set; } + public double BigramLambda { get; set; } + public double UnigramLambda { get; set; } + + internal override void WrapInContainer(ISmoothingModelContainer container) => container.LinearInterpolation = this; + } + + public class LinearInterpolationSmoothingModelDescriptor : DescriptorBase, ILinearInterpolationSmoothingModel + { + double ILinearInterpolationSmoothingModel.TrigramLambda { get; set; } + double ILinearInterpolationSmoothingModel.UnigramLambda { get; set; } + double ILinearInterpolationSmoothingModel.BigramLambda { get; set; } + + public LinearInterpolationSmoothingModelDescriptor TrigramLambda(double lambda) => Assign(a => a.TrigramLambda = lambda); + public LinearInterpolationSmoothingModelDescriptor UnigramLambda(double lambda) => Assign(a => a.UnigramLambda = lambda); + public LinearInterpolationSmoothingModelDescriptor BigramLambda(double lambda) => Assign(a => a.BigramLambda = lambda); + } +} diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelBase.cs b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelBase.cs new file mode 100644 index 00000000000..2c517130bbd --- /dev/null +++ b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelBase.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace Nest +{ + [JsonObject] + public interface ISmoothingModel {} + + public abstract class SmoothingModelBase + { + public static implicit operator SmoothingModelContainer(SmoothingModelBase model) => model == null + ? null + : new SmoothingModelContainer(model); + + internal abstract void WrapInContainer(ISmoothingModelContainer container); + } +} diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelContainer.cs b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelContainer.cs new file mode 100644 index 00000000000..ef79e8b9eeb --- /dev/null +++ b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/SmoothingModelContainer.cs @@ -0,0 +1,49 @@ +using System; +using Newtonsoft.Json; + +namespace Nest +{ + [JsonObject(MemberSerialization.OptIn)] + [JsonConverter(typeof(ReserializeJsonConverter))] + public interface ISmoothingModelContainer + { + [JsonProperty("stupid_backoff")] + IStupidBackoffSmoothingModel StupidBackoff { get; set; } + + [JsonProperty("laplace")] + ILaplaceSmoothingModel Laplace { get; set; } + + [JsonProperty("linear_interpolation")] + ILinearInterpolationSmoothingModel LinearInterpolation { get; set; } + } + + [JsonObject(MemberSerialization.OptIn)] + public class SmoothingModelContainer : ISmoothingModelContainer, IDescriptor + { + internal SmoothingModelContainer() {} + + public SmoothingModelContainer(SmoothingModelBase model) + { + model.ThrowIfNull(nameof(model)); + model.WrapInContainer(this); + } + + IStupidBackoffSmoothingModel ISmoothingModelContainer.StupidBackoff { get; set; } + ILaplaceSmoothingModel ISmoothingModelContainer.Laplace { get; set; } + ILinearInterpolationSmoothingModel ISmoothingModelContainer.LinearInterpolation { get; set; } + } + + public class SmoothingModelContainerDescriptor : SmoothingModelContainer + { + private SmoothingModelContainerDescriptor Assign(Action assigner) => Fluent.Assign(this, assigner); + + public SmoothingModelContainerDescriptor StupidBackoff(Func selector) => + Assign(a => a.StupidBackoff = selector?.InvokeOrDefault(new StupidBackoffSmoothingModelDescriptor())); + + public SmoothingModelContainerDescriptor LinearInterpolation(Func selector) => + Assign(a => a.LinearInterpolation = selector?.InvokeOrDefault(new LinearInterpolationSmoothingModelDescriptor())); + + public SmoothingModelContainerDescriptor Laplace(Func selector) => + Assign(a => a.Laplace = selector?.InvokeOrDefault(new LaplaceSmoothingModelDescriptor())); + } +} diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/StupidBackoffSmoothingModel.cs b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/StupidBackoffSmoothingModel.cs new file mode 100644 index 00000000000..cdb5cdfe58d --- /dev/null +++ b/src/Nest/Search/Suggesters/PhraseSuggester/SmoothingModel/StupidBackoffSmoothingModel.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; +using System; + +namespace Nest +{ + [JsonObject] + [JsonConverter(typeof(ReadAsTypeJsonConverter))] + public interface IStupidBackoffSmoothingModel : ISmoothingModel + { + [JsonProperty("discount")] + double? Discount { get; set; } + } + + public class StupidBackoffSmoothingModel : SmoothingModelBase, IStupidBackoffSmoothingModel + { + public double? Discount { get; set; } + + internal override void WrapInContainer(ISmoothingModelContainer container) => container.StupidBackoff = this; + } + + public class StupidBackoffSmoothingModelDescriptor : DescriptorBase, IStupidBackoffSmoothingModel + { + double? IStupidBackoffSmoothingModel.Discount{ get; set; } + + public StupidBackoffSmoothingModelDescriptor Discount(double? discount) => Assign(a => a.Discount = discount); + } +} From cffec87940ecf51e135c9d3e5f027e1670040cf7 Mon Sep 17 00:00:00 2001 From: Mpdreamz Date: Wed, 25 Jan 2017 11:01:41 +0100 Subject: [PATCH 2/2] Update codeststandards to special case SmoothingContainer --- src/Tests/CodeStandards/Descriptors.doc.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tests/CodeStandards/Descriptors.doc.cs b/src/Tests/CodeStandards/Descriptors.doc.cs index 405d67490b3..7c985a23de8 100644 --- a/src/Tests/CodeStandards/Descriptors.doc.cs +++ b/src/Tests/CodeStandards/Descriptors.doc.cs @@ -45,6 +45,7 @@ where t.IsClass() && typeof(IDescriptor).IsAssignableFrom(t) { typeof(TriggerDescriptor), typeof(TriggerContainer) }, { typeof(TransformDescriptor), typeof(TransformContainer) }, { typeof(InputDescriptor), typeof(InputContainer) }, + { typeof(SmoothingModelContainerDescriptor), typeof(SmoothingModelContainer) }, { typeof(FluentDictionary<,>), typeof(FluentDictionary<,>) } };