diff --git a/docs/search/request/suggest-usage.asciidoc b/docs/search/request/suggest-usage.asciidoc index c9a24cfe770..caf50cd3763 100644 --- a/docs/search/request/suggest-usage.asciidoc +++ b/docs/search/request/suggest-usage.asciidoc @@ -62,8 +62,8 @@ s => s .Collate(c => c .Query(q => q .Source("{ \"match\": { \"{{field_name}}\": \"{{suggestion}}\" }}") - .Params(p => p.Add("field_name", "title")) ) + .Params(p => p.Add("field_name", "title")) .Prune() ) .Confidence(10.1) @@ -134,13 +134,13 @@ new SearchRequest { Collate = new PhraseSuggestCollate { - Query = new TemplateQuery + Query = new PhraseSuggestCollateQuery { Source = "{ \"match\": { \"{{field_name}}\": \"{{suggestion}}\" }}", - Params = new Dictionary - { - { "field_name", "title" } - } + }, + Params = new Dictionary + { + { "field_name", "title" } }, Prune = true }, @@ -189,10 +189,10 @@ new SearchRequest "phrase": { "collate": { "query": { - "source": "{ \"match\": { \"{{field_name}}\": \"{{suggestion}}\" }}", - "params": { - "field_name": "title" - } + "source": "{ \"match\": { \"{{field_name}}\": \"{{suggestion}}\" }}" + }, + "params": { + "field_name": "title" }, "prune": true }, diff --git a/src/Nest/QueryDsl/Abstractions/Container/IQueryContainer.cs b/src/Nest/QueryDsl/Abstractions/Container/IQueryContainer.cs index 8b60319568d..7a33cc6e090 100644 --- a/src/Nest/QueryDsl/Abstractions/Container/IQueryContainer.cs +++ b/src/Nest/QueryDsl/Abstractions/Container/IQueryContainer.cs @@ -137,8 +137,10 @@ public interface IQueryContainer [JsonProperty("function_score")] IFunctionScoreQuery FunctionScore { get; set; } +#pragma warning disable 618 [JsonProperty("template")] ITemplateQuery Template { get; set; } +#pragma warning restore 618 [JsonProperty("geo_bounding_box")] IGeoBoundingBoxQuery GeoBoundingBox { get; set; } diff --git a/src/Nest/QueryDsl/Abstractions/Container/QueryContainer-Assignments.cs b/src/Nest/QueryDsl/Abstractions/Container/QueryContainer-Assignments.cs index 87cbd2dc05c..53aa7ada130 100644 --- a/src/Nest/QueryDsl/Abstractions/Container/QueryContainer-Assignments.cs +++ b/src/Nest/QueryDsl/Abstractions/Container/QueryContainer-Assignments.cs @@ -46,7 +46,9 @@ public partial class QueryContainer : IQueryContainer, IDescriptor private IIndicesQuery _indices; #pragma warning restore 618 private IFunctionScoreQuery _functionScore; +#pragma warning disable 618 private ITemplateQuery _template; +#pragma warning restore 618 private IGeoBoundingBoxQuery _geoBoundingBox; private IGeoDistanceQuery _geoDistance; private IGeoPolygonQuery _geoPolygon; @@ -110,7 +112,9 @@ private T Set(T value) where T : IQuery IIndicesQuery IQueryContainer.Indices { get { return _indices; } set { _indices = Set(value); } } #pragma warning restore 618 IFunctionScoreQuery IQueryContainer.FunctionScore { get { return _functionScore; } set { _functionScore = Set(value); } } +#pragma warning disable 618 ITemplateQuery IQueryContainer.Template { get { return _template; } set { _template = Set(value); } } +#pragma warning restore 618 IGeoBoundingBoxQuery IQueryContainer.GeoBoundingBox { get { return _geoBoundingBox; } set { _geoBoundingBox = Set(value); } } IGeoDistanceQuery IQueryContainer.GeoDistance { get { return _geoDistance; } set { _geoDistance = Set(value); } } IGeoPolygonQuery IQueryContainer.GeoPolygon { get { return _geoPolygon; } set { _geoPolygon = Set(value); } } diff --git a/src/Nest/QueryDsl/Specialized/Template/TemplateQuery.cs b/src/Nest/QueryDsl/Specialized/Template/TemplateQuery.cs index 5081f02e101..83cc3c022dc 100644 --- a/src/Nest/QueryDsl/Specialized/Template/TemplateQuery.cs +++ b/src/Nest/QueryDsl/Specialized/Template/TemplateQuery.cs @@ -4,13 +4,11 @@ namespace Nest { + [Obsolete("Deprecated in 5.0.0. Use Search Template API instead")] [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [JsonConverter(typeof(ReadAsTypeJsonConverter))] public interface ITemplateQuery : IQuery { - [JsonProperty("file")] - string File { get; set; } - [JsonProperty("source")] string Source { get; set; } @@ -25,28 +23,33 @@ public interface ITemplateQuery : IQuery IDictionary Params { get; set; } } + [Obsolete("Deprecated in 5.0.0. Use Search Template API instead")] public class TemplateQuery : QueryBase, ITemplateQuery { protected override bool Conditionless => IsConditionless(this); - public string File { get; set; } + /// An inline script to be executed public string Source { get; set; } + /// An inline script to be executed [Obsolete("Inline is being deprecated for Source and will be removed in Elasticsearch 7.0")] public string Inline { get => this.Source; set => this.Source = value; } + public Id Id { get; set; } + public IDictionary Params { get; set;} internal override void InternalWrapInContainer(IQueryContainer c) => c.Template = this; - internal static bool IsConditionless(ITemplateQuery q) => q.File.IsNullOrEmpty() && q.Id == null && q.Source.IsNullOrEmpty(); + internal static bool IsConditionless(ITemplateQuery q) => q.Id == null && q.Source.IsNullOrEmpty(); } + [Obsolete("Deprecated in 5.0.0. Use Search Template API instead")] public class TemplateQueryDescriptor : QueryDescriptorBase, ITemplateQuery> , ITemplateQuery where T : class { protected override bool Conditionless => TemplateQuery.IsConditionless(this); - string ITemplateQuery.File { get; set; } + string ITemplateQuery.Source { get; set; } string ITemplateQuery.Inline { get => Self.Source; set => Self.Source = value; } Id ITemplateQuery.Id { get; set; } @@ -54,9 +57,8 @@ public class TemplateQueryDescriptor [Obsolete("Inline is being deprecated for Source and will be removed in Elasticsearch 7.0")] public TemplateQueryDescriptor Inline(string script) => Assign(a => a.Inline = script); - public TemplateQueryDescriptor Source(string script) => Assign(a => a.Source = script); - public TemplateQueryDescriptor File(string file) => Assign(a => a.File = file); + public TemplateQueryDescriptor Source(string script) => Assign(a => a.Source = script); public TemplateQueryDescriptor Id(Id id) => Assign(a => a.Id = id); diff --git a/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs b/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs index 48205620cb9..73b7c585997 100644 --- a/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs +++ b/src/Nest/QueryDsl/Visitor/DslPrettyPrintVisitor.cs @@ -155,7 +155,9 @@ private void Write(string queryType, Field field = null) public virtual void Visit(IGeoHashCellQuery filter) => Write("geohash_cell"); +#pragma warning disable 618 public virtual void Visit(ITemplateQuery query) => Write("template"); +#pragma warning restore 618 public virtual void Visit(ISpanMultiTermQuery query) => Write("span_multi_term"); diff --git a/src/Nest/QueryDsl/Visitor/QueryVisitor.cs b/src/Nest/QueryDsl/Visitor/QueryVisitor.cs index 44354c51b77..5f7734fd32b 100644 --- a/src/Nest/QueryDsl/Visitor/QueryVisitor.cs +++ b/src/Nest/QueryDsl/Visitor/QueryVisitor.cs @@ -66,7 +66,9 @@ public interface IQueryVisitor void Visit(IDateRangeQuery query); void Visit(INumericRangeQuery query); void Visit(ITermRangeQuery query); +#pragma warning disable 618 void Visit(ITemplateQuery query); +#pragma warning restore 618 void Visit(ISpanFirstQuery query); void Visit(ISpanNearQuery query); void Visit(ISpanNotQuery query); @@ -209,7 +211,9 @@ public virtual void Visit(IGeoDistanceQuery query) { } public virtual void Visit(IGeoHashCellQuery query) { } +#pragma warning disable 618 public virtual void Visit(ITemplateQuery query) { } +#pragma warning restore 618 public virtual void Visit(IGeoShapeMultiPointQuery query) { } diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs index d6aba8633ae..fe28e8c7174 100644 --- a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs +++ b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollate.cs @@ -4,34 +4,77 @@ namespace Nest { + /// + /// Checks each suggestion against the specified query to prune suggestions + /// for which no matching docs exist in the index. + /// [JsonObject(MemberSerialization = MemberSerialization.OptIn)] [JsonConverter(typeof(ReadAsTypeJsonConverter))] public interface IPhraseSuggestCollate { + /// + /// The collate query to run. + /// [JsonProperty("query")] - ITemplateQuery Query { get; set; } + IPhraseSuggestCollateQuery Query { get; set; } + /// + /// Controls if all phrase suggestions will be returned. When set to true, the suggestions will have + /// an additional option collate_match, which will be true if matching documents for the phrase was found, + /// false otherwise. The default value for is false. + /// [JsonProperty("prune")] bool? Prune { get; set; } + + /// + /// The parameters for the query. the suggestion value will be added to the variables you specify. + /// + [JsonProperty("params")] + IDictionary Params { get; set; } } + /// public class PhraseSuggestCollate : IPhraseSuggestCollate { - public ITemplateQuery Query { get; set; } + /// + public IPhraseSuggestCollateQuery Query { get; set; } + /// public bool? Prune { get; set; } + + /// + public IDictionary Params { get; set; } } public class PhraseSuggestCollateDescriptor : DescriptorBase, IPhraseSuggestCollate>, IPhraseSuggestCollate where T : class { - ITemplateQuery IPhraseSuggestCollate.Query { get; set; } - + IPhraseSuggestCollateQuery IPhraseSuggestCollate.Query { get; set; } + IDictionary IPhraseSuggestCollate.Params { get; set; } bool? IPhraseSuggestCollate.Prune { get; set; } - public PhraseSuggestCollateDescriptor Query(Func, ITemplateQuery> selector) => - Assign(a => a.Query = selector?.Invoke(new TemplateQueryDescriptor())); + /// + /// The collate query to run + /// + public PhraseSuggestCollateDescriptor Query(Func selector) => + Assign(a => a.Query = selector?.Invoke(new PhraseSuggestCollateQueryDescriptor())); + /// + /// Controls if all phrase suggestions will be returned. When set to true, the suggestions will have + /// an additional option collate_match, which will be true if matching documents for the phrase was found, + /// false otherwise. The default value for is false. + /// public PhraseSuggestCollateDescriptor Prune(bool? prune = true) => Assign(a => a.Prune = prune); + + /// + /// The parameters for the query. the suggestion value will be added to the variables you specify. + /// + public PhraseSuggestCollateDescriptor Params(IDictionary paramsDictionary) => Assign(a => a.Params = paramsDictionary); + + /// + /// The parameters for the query. the suggestion value will be added to the variables you specify. + /// + public PhraseSuggestCollateDescriptor Params(Func, FluentDictionary> paramsDictionary) => + Assign(a => a.Params = paramsDictionary(new FluentDictionary())); } } diff --git a/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollateQuery.cs b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollateQuery.cs new file mode 100644 index 00000000000..cda0adaf204 --- /dev/null +++ b/src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggestCollateQuery.cs @@ -0,0 +1,48 @@ +using Newtonsoft.Json; + +namespace Nest +{ + /// + /// A query to run for a phrase suggester collate + /// + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + [JsonConverter(typeof(ReadAsTypeJsonConverter))] + public interface IPhraseSuggestCollateQuery + { + /// + /// The source script to be executed + /// + [JsonProperty("source")] + string Source { get; set; } + + /// + /// The id for a stored script to execute + /// + [JsonProperty("id")] + Id Id { get; set; } + } + + /// + public class PhraseSuggestCollateQuery : IPhraseSuggestCollateQuery + { + /// + public string Source { get; set; } + + /// + public Id Id { get; set; } + } + + /// + public class PhraseSuggestCollateQueryDescriptor : + DescriptorBase, IPhraseSuggestCollateQuery + { + string IPhraseSuggestCollateQuery.Source { get; set; } + Id IPhraseSuggestCollateQuery.Id { get; set; } + + /// + public PhraseSuggestCollateQueryDescriptor Source(string source) => Assign(a => a.Source = source); + + /// + public PhraseSuggestCollateQueryDescriptor Id(Id id) => Assign(a => a.Id = id); + } +} diff --git a/src/Tests/QueryDsl/Specialized/Template/TemplateQueryUsageTests.cs b/src/Tests/QueryDsl/Specialized/Template/TemplateQueryUsageTests.cs index 6388d8148a7..f43dc493dcd 100644 --- a/src/Tests/QueryDsl/Specialized/Template/TemplateQueryUsageTests.cs +++ b/src/Tests/QueryDsl/Specialized/Template/TemplateQueryUsageTests.cs @@ -26,6 +26,7 @@ public TemplateQueryUsageTests(ReadOnlyCluster i, EndpointUsage usage) : base(i, } }; +#pragma warning disable 618 protected override QueryContainer QueryInitializer => new TemplateQuery { Name = "named_query", @@ -37,7 +38,6 @@ public TemplateQueryUsageTests(ReadOnlyCluster i, EndpointUsage usage) : base(i, } }; -#pragma warning disable 618 protected override QueryContainer QueryFluent(QueryContainerDescriptor q) => q .Template(sn => sn .Name("named_query") @@ -45,20 +45,18 @@ protected override QueryContainer QueryFluent(QueryContainerDescriptor .Source(_templateString) .Params(p=>p.Add("query_string", "all about search")) ); -#pragma warning restore 618 protected override ConditionlessWhen ConditionlessWhen => new ConditionlessWhen(a => a.Template) { q => { q.Source = ""; q.Id = null; - q.File = ""; }, q => { q.Source = null; q.Id = null; - q.File = null; } }; } +#pragma warning restore 618 } diff --git a/src/Tests/Search/Request/SuggestUsageTests.cs b/src/Tests/Search/Request/SuggestUsageTests.cs index 5fd281fcab3..33d063a98bd 100644 --- a/src/Tests/Search/Request/SuggestUsageTests.cs +++ b/src/Tests/Search/Request/SuggestUsageTests.cs @@ -50,9 +50,9 @@ public SuggestUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cl collate = new { query = new { source = "{ \"match\": { \"{{field_name}}\": \"{{suggestion}}\" }}", - @params = new { - field_name = "title" - } + }, + @params = new { + field_name = "title" }, prune = true, }, @@ -81,7 +81,8 @@ public SuggestUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cl suggest_mode = "always" }, text = "hello world" - } } + } + } } }; @@ -123,8 +124,8 @@ public SuggestUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cl .Collate(c => c .Query(q => q .Source("{ \"match\": { \"{{field_name}}\": \"{{suggestion}}\" }}") - .Params(p => p.Add("field_name", "title")) ) + .Params(p => p.Add("field_name", "title")) .Prune() ) .Confidence(10.1) @@ -190,13 +191,13 @@ public SuggestUsageTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cl { Collate = new PhraseSuggestCollate { - Query = new TemplateQuery + Query = new PhraseSuggestCollateQuery { Source = "{ \"match\": { \"{{field_name}}\": \"{{suggestion}}\" }}", - Params = new Dictionary - { - { "field_name", "title" } - } + }, + Params = new Dictionary + { + { "field_name", "title" } }, Prune = true },