1
+ // Licensed to Elasticsearch B.V under one or more agreements.
2
+ // Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3
+ // See the LICENSE file in the project root for more information
4
+
5
+ using System ;
6
+ using System . Collections . Generic ;
7
+ using System . Linq . Expressions ;
8
+ using System . Runtime . Serialization ;
9
+ using Elasticsearch . Net ;
10
+ using Elasticsearch . Net . Utf8Json ;
11
+ using Nest ;
12
+
13
+ namespace Nest
14
+ {
15
+ /// <summary>
16
+ /// Uses a pre-trained data frame analytics model to infer against the data that is being ingested in the pipeline.
17
+ /// <para />
18
+ /// Available in Elasticsearch 7.6.0+ with at least basic license.
19
+ /// </summary>
20
+ [ InterfaceDataContract ]
21
+ public interface IInferenceProcessor : IProcessor
22
+ {
23
+ /// <summary>
24
+ /// The ID of the model to load and infer against.
25
+ /// </summary>
26
+ [ DataMember ( Name = "model_id" ) ]
27
+ string ModelId { get ; set ; }
28
+
29
+ /// <summary>
30
+ /// Field added to incoming documents to contain results objects.
31
+ /// </summary>
32
+ [ DataMember ( Name = "target_field" ) ]
33
+ Field TargetField { get ; set ; }
34
+
35
+ /// <summary>
36
+ /// Maps the document field names to the known field names of the model.
37
+ /// </summary>
38
+ [ DataMember ( Name = "field_mappings" ) ]
39
+ IDictionary < Field , Field > FieldMappings { get ; set ; }
40
+
41
+ /// <summary>
42
+ /// Contains the inference type and its options.
43
+ /// </summary>
44
+ [ DataMember ( Name = "inference_config" ) ]
45
+ IInferenceConfig InferenceConfig { get ; set ; }
46
+ }
47
+
48
+ /// <inheritdoc cref="IInferenceProcessor" />
49
+ public class InferenceProcessor : ProcessorBase , IInferenceProcessor
50
+ {
51
+ /// <inheritdoc />
52
+ public string ModelId { get ; set ; }
53
+
54
+ /// <inheritdoc />
55
+ public Field TargetField { get ; set ; }
56
+
57
+ /// <inheritdoc />
58
+ public IDictionary < Field , Field > FieldMappings { get ; set ; }
59
+
60
+ /// <inheritdoc />
61
+ public IInferenceConfig InferenceConfig { get ; set ; }
62
+
63
+ protected override string Name => "inference" ;
64
+ }
65
+
66
+ /// <inheritdoc cref="IInferenceProcessor" />
67
+ public class InferenceProcessorDescriptor < T >
68
+ : ProcessorDescriptorBase < InferenceProcessorDescriptor < T > , IInferenceProcessor > , IInferenceProcessor
69
+ where T : class
70
+ {
71
+ protected override string Name => "inference" ;
72
+
73
+ Field IInferenceProcessor . TargetField { get ; set ; }
74
+ string IInferenceProcessor . ModelId { get ; set ; }
75
+ IInferenceConfig IInferenceProcessor . InferenceConfig { get ; set ; }
76
+ IDictionary < Field , Field > IInferenceProcessor . FieldMappings { get ; set ; }
77
+
78
+ /// <inheritdoc cref="IInferenceProcessor.TargetField" />
79
+ public InferenceProcessorDescriptor < T > TargetField ( Field field ) => Assign ( field , ( a , v ) => a . TargetField = v ) ;
80
+
81
+ /// <inheritdoc cref="IInferenceProcessor.TargetField" />
82
+ public InferenceProcessorDescriptor < T > TargetField < TValue > ( Expression < Func < T , TValue > > objectPath ) =>
83
+ Assign ( objectPath , ( a , v ) => a . TargetField = v ) ;
84
+
85
+ /// <inheritdoc cref="IInferenceProcessor.ModelId" />
86
+ public InferenceProcessorDescriptor < T > ModelId ( string modelId ) =>
87
+ Assign ( modelId , ( a , v ) => a . ModelId = v ) ;
88
+
89
+ /// <inheritdoc cref="IInferenceProcessor.ModelId" />
90
+ public InferenceProcessorDescriptor < T > InferenceConfig ( Func < InferenceConfigDescriptor < T > , IInferenceConfig > selector ) =>
91
+ Assign ( selector , ( a , v ) => a . InferenceConfig = v . InvokeOrDefault ( new InferenceConfigDescriptor < T > ( ) ) ) ;
92
+
93
+ /// <inheritdoc cref="IInferenceProcessor.FieldMappings" />
94
+ public InferenceProcessorDescriptor < T > FieldMappings ( Func < FluentDictionary < Field , Field > , FluentDictionary < Field , Field > > selector = null ) =>
95
+ Assign ( selector , ( a , v ) => a . FieldMappings = v . InvokeOrDefault ( new FluentDictionary < Field , Field > ( ) ) ) ;
96
+ }
97
+
98
+ [ ReadAs ( typeof ( InferenceConfig ) ) ]
99
+ public interface IInferenceConfig
100
+ {
101
+
102
+ [ DataMember ( Name = "regression" ) ]
103
+ IRegressionInferenceConfig Regression { get ; set ; }
104
+
105
+ [ DataMember ( Name = "classification" ) ]
106
+ IClassificationInferenceConfig Classification { get ; set ; }
107
+ }
108
+
109
+ public class InferenceConfig
110
+ : IInferenceConfig
111
+ {
112
+ public IRegressionInferenceConfig Regression { get ; set ; }
113
+
114
+ public IClassificationInferenceConfig Classification { get ; set ; }
115
+ }
116
+
117
+ public class InferenceConfigDescriptor < T > : DescriptorBase < InferenceConfigDescriptor < T > , IInferenceConfig > , IInferenceConfig
118
+ {
119
+ IRegressionInferenceConfig IInferenceConfig . Regression { get ; set ; }
120
+ IClassificationInferenceConfig IInferenceConfig . Classification { get ; set ; }
121
+
122
+ public InferenceConfigDescriptor < T > Regression ( Func < RegressionInferenceConfigDescriptor < T > , IRegressionInferenceConfig > selector ) =>
123
+ Assign ( selector , ( a , v ) => a . Regression = v . InvokeOrDefault ( new RegressionInferenceConfigDescriptor < T > ( ) ) ) ;
124
+
125
+ public InferenceConfigDescriptor < T > Classification ( Func < ClassificationInferenceConfigDescriptor < T > , IClassificationInferenceConfig > selector ) =>
126
+ Assign ( selector , ( a , v ) => a . Classification = v . InvokeOrDefault ( new ClassificationInferenceConfigDescriptor < T > ( ) ) ) ;
127
+ }
128
+
129
+ [ ReadAs ( typeof ( RegressionInferenceConfig ) ) ]
130
+ public interface IRegressionInferenceConfig
131
+ {
132
+ /// <summary>
133
+ /// Specifies the field to which the inference prediction is written. Defaults to <c>predicted_value</c>.
134
+ /// </summary>
135
+ [ DataMember ( Name = "results_field" ) ]
136
+ Field ResultsField { get ; set ; }
137
+ }
138
+
139
+ public class RegressionInferenceConfig : IRegressionInferenceConfig
140
+ {
141
+ /// <summary>
142
+ /// Specifies the field to which the inference prediction is written. Defaults to <c>predicted_value</c>.
143
+ /// </summary>
144
+ public Field ResultsField { get ; set ; }
145
+ }
146
+
147
+ public class RegressionInferenceConfigDescriptor < T >
148
+ : DescriptorBase < RegressionInferenceConfigDescriptor < T > , IRegressionInferenceConfig > , IRegressionInferenceConfig
149
+ {
150
+ Field IRegressionInferenceConfig . ResultsField { get ; set ; }
151
+
152
+ /// <inheritdoc cref="IRegressionInferenceConfig.ResultsField" />
153
+ public RegressionInferenceConfigDescriptor < T > ResultsField ( Field field ) => Assign ( field , ( a , v ) => a . ResultsField = v ) ;
154
+
155
+ /// <inheritdoc cref="IRegressionInferenceConfig.ResultsField" />
156
+ public RegressionInferenceConfigDescriptor < T > ResultsField < TValue > ( Expression < Func < T , TValue > > objectPath ) =>
157
+ Assign ( objectPath , ( a , v ) => a . ResultsField = v ) ;
158
+ }
159
+
160
+ [ ReadAs ( typeof ( ClassificationInferenceConfig ) ) ]
161
+ public interface IClassificationInferenceConfig
162
+ {
163
+ /// <summary>
164
+ /// Specifies the field to which the inference prediction is written. Defaults to <c>predicted_value</c>.
165
+ /// </summary>
166
+ [ DataMember ( Name = "results_field" ) ]
167
+ Field ResultsField { get ; set ; }
168
+
169
+ /// <summary>
170
+ /// Specifies the number of top class predictions to return. Defaults to <c>0</c>.
171
+ /// </summary>
172
+ [ DataMember ( Name = "num_top_classes" ) ]
173
+ int ? NumTopClasses { get ; set ; }
174
+
175
+ /// <summary>
176
+ /// Specifies the field to which the top classes are written. Defaults to <c>top_classes</c>.
177
+ /// </summary>
178
+ [ DataMember ( Name = "top_classes_results_field" ) ]
179
+ Field TopClassesResultsField { get ; set ; }
180
+ }
181
+
182
+ public class ClassificationInferenceConfig : IClassificationInferenceConfig
183
+ {
184
+ /// <summary>
185
+ /// Specifies the field to which the inference prediction is written. Defaults to <c>predicted_value</c>.
186
+ /// </summary>
187
+ public Field ResultsField { get ; set ; }
188
+
189
+ /// <summary>
190
+ /// Specifies the number of top class predictions to return. Defaults to <c>0</c>.
191
+ /// </summary>
192
+ public int ? NumTopClasses { get ; set ; }
193
+
194
+ /// <summary>
195
+ /// Specifies the field to which the top classes are written. Defaults to <c>top_classes</c>.
196
+ /// </summary>
197
+ public Field TopClassesResultsField { get ; set ; }
198
+ }
199
+
200
+ public class ClassificationInferenceConfigDescriptor < T > : DescriptorBase < ClassificationInferenceConfigDescriptor < T > , IClassificationInferenceConfig > , IClassificationInferenceConfig
201
+ {
202
+ Field IClassificationInferenceConfig . ResultsField { get ; set ; }
203
+ int ? IClassificationInferenceConfig . NumTopClasses { get ; set ; }
204
+ Field IClassificationInferenceConfig . TopClassesResultsField { get ; set ; }
205
+
206
+ /// <inheritdoc cref="IClassificationInferenceConfig.ResultsField" />
207
+ public ClassificationInferenceConfigDescriptor < T > ResultsField ( Field field ) => Assign ( field , ( a , v ) => a . ResultsField = v ) ;
208
+
209
+ /// <inheritdoc cref="IClassificationInferenceConfig.ResultsField" />
210
+ public ClassificationInferenceConfigDescriptor < T > ResultsField < TValue > ( Expression < Func < T , TValue > > objectPath ) =>
211
+ Assign ( objectPath , ( a , v ) => a . ResultsField = v ) ;
212
+
213
+ /// <inheritdoc cref="IClassificationInferenceConfig.NumTopClasses" />
214
+ public ClassificationInferenceConfigDescriptor < T > NumTopClasses ( int ? numTopClasses ) => Assign ( numTopClasses , ( a , v ) => a . NumTopClasses = v ) ;
215
+
216
+ /// <inheritdoc cref="IClassificationInferenceConfig.TopClassesResultsField" />
217
+ public ClassificationInferenceConfigDescriptor < T > TopClassesResultsField ( Field field ) => Assign ( field , ( a , v ) => a . TopClassesResultsField = v ) ;
218
+
219
+ /// <inheritdoc cref="IClassificationInferenceConfig.TopClassesResultsField" />
220
+ public ClassificationInferenceConfigDescriptor < T > TopClassesResultsField < TValue > ( Expression < Func < T , TValue > > objectPath ) =>
221
+ Assign ( objectPath , ( a , v ) => a . TopClassesResultsField = v ) ;
222
+ }
223
+ }
0 commit comments