stretchy-model 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +66 -10
- data/Rakefile +92 -0
- data/lib/stretchy/attributes/transformers/keyword_transformer.rb +85 -0
- data/lib/stretchy/attributes/type/keyword.rb +11 -0
- data/lib/stretchy/attributes.rb +10 -0
- data/lib/stretchy/open_search_compatibility.rb +86 -0
- data/lib/stretchy/querying.rb +6 -5
- data/lib/stretchy/relation.rb +3 -3
- data/lib/stretchy/relations/aggregation_methods.rb +758 -0
- data/lib/stretchy/relations/finder_methods.rb +21 -3
- data/lib/stretchy/relations/merger.rb +6 -6
- data/lib/stretchy/relations/query_builder.rb +23 -9
- data/lib/stretchy/relations/query_methods.rb +10 -36
- data/lib/stretchy/utils.rb +21 -0
- data/lib/stretchy/version.rb +1 -3
- data/lib/stretchy.rb +37 -8
- metadata +50 -3
@@ -0,0 +1,758 @@
|
|
1
|
+
module Stretchy
|
2
|
+
module Relations
|
3
|
+
module AggregationMethods
|
4
|
+
|
5
|
+
AGGREGATION_METHODS = [
|
6
|
+
:aggregation,
|
7
|
+
:avg,
|
8
|
+
:bucket_script,
|
9
|
+
:bucket_selector,
|
10
|
+
:bucket_sort,
|
11
|
+
:cardinality,
|
12
|
+
:children,
|
13
|
+
:composite,
|
14
|
+
:date_histogram,
|
15
|
+
:date_range,
|
16
|
+
:extended_stats,
|
17
|
+
:filter, # filter is a query method
|
18
|
+
:filters,
|
19
|
+
:geo_bounds,
|
20
|
+
:geo_centroid,
|
21
|
+
:global,
|
22
|
+
:histogram,
|
23
|
+
:ip_range,
|
24
|
+
:max,
|
25
|
+
:min,
|
26
|
+
:missing,
|
27
|
+
:nested,
|
28
|
+
:percentile_ranks,
|
29
|
+
:percentiles,
|
30
|
+
:range,
|
31
|
+
:reverse_nested,
|
32
|
+
:sampler,
|
33
|
+
:scripted_metric,
|
34
|
+
:significant_terms,
|
35
|
+
:stats,
|
36
|
+
:sum,
|
37
|
+
:terms,
|
38
|
+
:top_hits,
|
39
|
+
:top_metrics,
|
40
|
+
:value_count,
|
41
|
+
:weighted_avg
|
42
|
+
].freeze
|
43
|
+
|
44
|
+
# Adds an aggregation to the query.
|
45
|
+
#
|
46
|
+
# @param name [Symbol, String] the name of the aggregation
|
47
|
+
# @param options [Hash] a hash of options for the aggregation
|
48
|
+
# @param block [Proc] an optional block to further configure the aggregation
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# Model.aggregation(:avg_price, field: :price)
|
52
|
+
# Model.aggregation(:price_ranges) do
|
53
|
+
# range field: :price, ranges: [{to: 100}, {from: 100, to: 200}, {from: 200}]
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# Aggregation results are available in the `aggregations` method of the results under name provided in the aggregation.
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# results = Model.where(color: :blue).aggregation(:avg_price, field: :price)
|
60
|
+
# results.aggregations.avg_price
|
61
|
+
#
|
62
|
+
# @return [Stretchy::Relation] a new relation
|
63
|
+
def aggregation(name, options = {}, &block)
|
64
|
+
spawn.aggregation!(name, options, &block)
|
65
|
+
end
|
66
|
+
|
67
|
+
def aggregation!(name, options = {}, &block) # :nodoc:
|
68
|
+
self.aggregation_values += [{name: name, args: assume_keyword_field(options)}]
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
# Public: Perform an avg aggregation.
|
75
|
+
#
|
76
|
+
# name - The Symbol or String name of the aggregation.
|
77
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
78
|
+
# :field - The field to calculate the average on.
|
79
|
+
# aggs - The Hash of nested aggregations.
|
80
|
+
#
|
81
|
+
# Examples
|
82
|
+
#
|
83
|
+
# Model.aggregation(:average_price, field: :price)
|
84
|
+
#
|
85
|
+
# Returns a new Stretchy::Relation.
|
86
|
+
def avg(name, options = {}, *aggs)
|
87
|
+
options = {avg: options}.merge(*aggs)
|
88
|
+
aggregation(name, options)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Public: Perform a bucket_script aggregation.
|
92
|
+
#
|
93
|
+
# name - The Symbol or String name of the aggregation.
|
94
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
95
|
+
# :buckets_path - The paths to the buckets.
|
96
|
+
# :script - The script to execute.
|
97
|
+
# aggs - The Hash of nested aggregations.
|
98
|
+
#
|
99
|
+
# Examples
|
100
|
+
#
|
101
|
+
# Model.aggregation(:total_sales, script: "params.tShirtsSold * params.price", buckets_path: {tShirtsSold: "tShirtsSold", price: "price"})
|
102
|
+
#
|
103
|
+
# Returns a new Stretchy::Relation.
|
104
|
+
def bucket_script(name, options = {}, *aggs)
|
105
|
+
options = {bucket_script: options}.merge(*aggs)
|
106
|
+
aggregation(name, options)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Public: Perform a bucket_selector aggregation.
|
110
|
+
#
|
111
|
+
# name - The Symbol or String name of the aggregation.
|
112
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
113
|
+
# :script - The script to determine whether the current bucket will be retained.
|
114
|
+
# aggs - The Hash of nested aggregations.
|
115
|
+
#
|
116
|
+
# Examples
|
117
|
+
#
|
118
|
+
# Model.aggregation(:sales_bucket_filter, script: "params.totalSales > 200", buckets_path: {totalSales: "totalSales"})
|
119
|
+
#
|
120
|
+
# Returns a new Stretchy::Relation.
|
121
|
+
def bucket_selector(name, options = {}, *aggs)
|
122
|
+
options = {bucket_selector: options}.merge(*aggs)
|
123
|
+
aggregation(name, options)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Public: Perform a bucket_sort aggregation.
|
127
|
+
#
|
128
|
+
# name - The Symbol or String name of the aggregation.
|
129
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
130
|
+
# :field - The field to sort on.
|
131
|
+
# aggs - The Hash of nested aggregations.
|
132
|
+
#
|
133
|
+
# Examples
|
134
|
+
#
|
135
|
+
# Model.bucket_sort(:my_agg, {field: 'my_field'})
|
136
|
+
# Model.bucket_sort(:my_agg, {field: 'my_field'}, aggs: {...})
|
137
|
+
#
|
138
|
+
# Returns a new Stretchy::Relation.
|
139
|
+
def bucket_sort(name, options = {}, *aggs)
|
140
|
+
options = {bucket_sort: options}.merge(*aggs)
|
141
|
+
aggregation(name, options)
|
142
|
+
end
|
143
|
+
|
144
|
+
# Public: Perform a cardinality aggregation.
|
145
|
+
#
|
146
|
+
# name - The Symbol or String name of the aggregation.
|
147
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
148
|
+
# :field - The field to perform the aggregation on.
|
149
|
+
# aggs - The Hash of nested aggregations.
|
150
|
+
#
|
151
|
+
# Examples
|
152
|
+
#
|
153
|
+
# Model.cardinality(:unique_names, {field: 'names'})
|
154
|
+
# Model.cardinality(:unique_names, {field: 'names'}, aggs: {...})
|
155
|
+
#
|
156
|
+
# Returns a new Stretchy::Relation.
|
157
|
+
def cardinality(name, options = {}, *aggs)
|
158
|
+
options = {cardinality: options}.merge(*aggs)
|
159
|
+
aggregation(name, options)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Public: Perform a children aggregation.
|
163
|
+
#
|
164
|
+
# name - The Symbol or String name of the aggregation.
|
165
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
166
|
+
# :type - The type of children to aggregate.
|
167
|
+
# aggs - The Hash of nested aggregations.
|
168
|
+
#
|
169
|
+
# Examples
|
170
|
+
#
|
171
|
+
# Model.children(:my_agg, {type: 'my_type'})
|
172
|
+
# Model.children(:my_agg, {type: 'my_type'}, aggs: {...})
|
173
|
+
#
|
174
|
+
# Returns a new Stretchy::Relation.
|
175
|
+
def children(name, options = {}, *aggs)
|
176
|
+
options = {children: options}.merge(*aggs)
|
177
|
+
aggregation(name, options)
|
178
|
+
end
|
179
|
+
|
180
|
+
# Public: Perform a composite aggregation.
|
181
|
+
#
|
182
|
+
# name - The Symbol or String name of the aggregation.
|
183
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
184
|
+
# :sources - The sources to use for the composite aggregation.
|
185
|
+
# :size - The size of the composite aggregation.
|
186
|
+
# aggs - The Hash of nested aggregations.
|
187
|
+
#
|
188
|
+
# Examples
|
189
|
+
#
|
190
|
+
# Model.composite(:my_agg, {sources: [...], size: 100})
|
191
|
+
# Model.composite(:my_agg, {sources: [...], size: 100}, aggs: {...})
|
192
|
+
#
|
193
|
+
# Returns a new Stretchy::Relation.
|
194
|
+
def composite(name, options = {}, *aggs)
|
195
|
+
options = {composite: options}.merge(*aggs)
|
196
|
+
aggregation(name, options)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Public: Perform a date_histogram aggregation.
|
200
|
+
#
|
201
|
+
# name - The Symbol or String name of the aggregation.
|
202
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
203
|
+
# :field - The field to use for the date_histogram aggregation.
|
204
|
+
# :interval - The interval for the date_histogram aggregation.
|
205
|
+
# :calendar_interval - The calendar interval for the date_histogram aggregation.
|
206
|
+
# :format - The format for the date_histogram aggregation.
|
207
|
+
# :time_zone - The time zone for the date_histogram aggregation.
|
208
|
+
# :min_doc_count - The minimum document count for the date_histogram aggregation.
|
209
|
+
# :extended_bounds - The extended bounds for the date_histogram aggregation.
|
210
|
+
# aggs - The Hash of nested aggregations.
|
211
|
+
#
|
212
|
+
# Examples
|
213
|
+
#
|
214
|
+
# Model.date_histogram(:my_agg, {field: 'date', interval: 'month', format: 'MM-yyyy', time_zone: 'UTC'})
|
215
|
+
# Model.date_histogram(:my_agg, {field: 'date', calendar_interval: :month, format: 'MM-yyyy', time_zone: 'UTC'}, aggs: {...})
|
216
|
+
#
|
217
|
+
# Returns a new Stretchy::Relation.
|
218
|
+
def date_histogram(name, options = {}, *aggs)
|
219
|
+
options = {date_histogram: options}.merge(*aggs)
|
220
|
+
aggregation(name, options)
|
221
|
+
end
|
222
|
+
|
223
|
+
# Public: Perform a date_range aggregation.
|
224
|
+
#
|
225
|
+
# name - The Symbol or String name of the aggregation.
|
226
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
227
|
+
# :field - The field to use for the date_range aggregation.
|
228
|
+
# :format - The format for the date_range aggregation.
|
229
|
+
# :time_zone - The time zone for the date_range aggregation.
|
230
|
+
# :ranges - The ranges for the date_range aggregation.
|
231
|
+
# :keyed - The keyed option for the date_range aggregation.
|
232
|
+
# aggs - The Hash of nested aggregations.
|
233
|
+
#
|
234
|
+
# Examples
|
235
|
+
#
|
236
|
+
# Model.date_range(:my_agg, {field: 'date', format: 'MM-yyyy', time_zone: 'UTC', ranges: [{to: 'now', from: 'now-1M'}]})
|
237
|
+
# Model.date_range(:my_agg, {field: 'date', format: 'MM-yyyy', time_zone: 'UTC', ranges: [{to: 'now', from: 'now-1M'}]}, aggs: {...})
|
238
|
+
#
|
239
|
+
# Returns a new Stretchy::Relation.
|
240
|
+
def date_range(name, options = {}, *aggs)
|
241
|
+
options = {date_range: options}.merge(*aggs)
|
242
|
+
aggregation(name, options)
|
243
|
+
end
|
244
|
+
# Public: Perform an extended_stats aggregation.
|
245
|
+
#
|
246
|
+
# name - The Symbol or String name of the aggregation.
|
247
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
248
|
+
# :field - The field to use for the extended_stats aggregation.
|
249
|
+
# :sigma - The sigma for the extended_stats aggregation.
|
250
|
+
# aggs - The Array of additional nested aggregations (optional).
|
251
|
+
#
|
252
|
+
# Examples
|
253
|
+
#
|
254
|
+
# Model.extended_stats(:my_agg, {field: 'field_name', sigma: 1.0})
|
255
|
+
# Model.extended_stats(:my_agg, {field: 'field_name', sigma: 1.0}, aggs: {...})
|
256
|
+
#
|
257
|
+
# Returns a new Stretchy::Relation.
|
258
|
+
def extended_stats(name, options = {}, *aggs)
|
259
|
+
options = {extended_stats: options}.merge(*aggs)
|
260
|
+
aggregation(name, options)
|
261
|
+
end
|
262
|
+
|
263
|
+
# Public: Perform a filter_agg aggregation.
|
264
|
+
#
|
265
|
+
# name - The Symbol or String name of the aggregation.
|
266
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
267
|
+
# :filter - The filter to use for the filter_agg aggregation.
|
268
|
+
# aggs - The Array of additional nested aggregations (optional).
|
269
|
+
#
|
270
|
+
# Examples
|
271
|
+
#
|
272
|
+
# Model.filter_agg(:my_agg, {filter: {...}})
|
273
|
+
# Model.filter_agg(:my_agg, {filter: {...}}, aggs: {...})
|
274
|
+
#
|
275
|
+
# Returns a new Stretchy::Relation.
|
276
|
+
def filter(name, options = {}, *aggs)
|
277
|
+
options = {filter: options}.merge(*aggs)
|
278
|
+
aggregation(name, options)
|
279
|
+
end
|
280
|
+
|
281
|
+
# Public: Perform a filters aggregation.
|
282
|
+
#
|
283
|
+
# name - The Symbol or String name of the aggregation.
|
284
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
285
|
+
# :filters - The filters to use for the filters aggregation.
|
286
|
+
# aggs - The Array of additional nested aggregations (optional).
|
287
|
+
#
|
288
|
+
# Examples
|
289
|
+
#
|
290
|
+
# Model.filters(:my_agg, {filters: {...}})
|
291
|
+
# Model.filters(:my_agg, {filters: {...}}, aggs: {...})
|
292
|
+
#
|
293
|
+
# Returns a new Stretchy::Relation.
|
294
|
+
def filters(name, options = {}, *aggs)
|
295
|
+
options = {filters: options}.merge(*aggs)
|
296
|
+
aggregation(name, options)
|
297
|
+
end
|
298
|
+
|
299
|
+
# Public: Perform a geo_bounds aggregation.
|
300
|
+
#
|
301
|
+
# name - The Symbol or String name of the aggregation.
|
302
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
303
|
+
# :field - The field to use for the geo_bounds aggregation.
|
304
|
+
# aggs - The Array of additional nested aggregations (optional).
|
305
|
+
#
|
306
|
+
# Examples
|
307
|
+
#
|
308
|
+
# Model.geo_bounds(:my_agg, {field: 'location_field'})
|
309
|
+
# Model.geo_bounds(:my_agg, {field: 'location_field'}, aggs: {...})
|
310
|
+
#
|
311
|
+
# Returns a new Stretchy::Relation.
|
312
|
+
def geo_bounds(name, options = {}, *aggs)
|
313
|
+
options = {geo_bounds: options}.merge(*aggs)
|
314
|
+
aggregation(name, options)
|
315
|
+
end
|
316
|
+
|
317
|
+
# Public: Perform a geo_centroid aggregation.
|
318
|
+
#
|
319
|
+
# name - The Symbol or String name of the aggregation.
|
320
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
321
|
+
# :field - The field to use for the geo_centroid aggregation.
|
322
|
+
# aggs - The Array of additional nested aggregations (optional).
|
323
|
+
#
|
324
|
+
# Examples
|
325
|
+
#
|
326
|
+
# Model.geo_centroid(:my_agg, {field: 'location_field'})
|
327
|
+
# Model.geo_centroid(:my_agg, {field: 'location_field'}, aggs: {...})
|
328
|
+
#
|
329
|
+
# Returns a new Stretchy::Relation.
|
330
|
+
def geo_centroid(name, options = {}, *aggs)
|
331
|
+
options = {geo_centroid: options}.merge(*aggs)
|
332
|
+
aggregation(name, options)
|
333
|
+
end
|
334
|
+
|
335
|
+
# Public: Perform a global aggregation.
|
336
|
+
#
|
337
|
+
# name - The Symbol or String name of the aggregation.
|
338
|
+
# options - The Hash options used to refine the aggregation (default: {}).
|
339
|
+
# aggs - The Array of additional nested aggregations (optional).
|
340
|
+
#
|
341
|
+
# Examples
|
342
|
+
#
|
343
|
+
# Model.global(:my_agg)
|
344
|
+
# Model.global(:my_agg, {}, aggs: {...})
|
345
|
+
#
|
346
|
+
# Returns a new Stretchy::Relation.
|
347
|
+
def global(name, options = {}, *aggs)
|
348
|
+
options = {global: options}.merge(*aggs)
|
349
|
+
aggregation(name, options)
|
350
|
+
end
|
351
|
+
# Public: Perform a histogram aggregation.
|
352
|
+
#
|
353
|
+
# name - The Symbol or String name of the aggregation.
|
354
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
355
|
+
# :field - The field to use for the histogram aggregation.
|
356
|
+
# :interval - The interval for the histogram aggregation.
|
357
|
+
# :min_doc_count - The minimum document count for the histogram aggregation.
|
358
|
+
# :extended_bounds - The extended bounds for the histogram aggregation.
|
359
|
+
# aggs - The Array of additional nested aggregations (optional).
|
360
|
+
#
|
361
|
+
# Examples
|
362
|
+
#
|
363
|
+
# Model.histogram(:my_agg, {field: 'field_name', interval: 5})
|
364
|
+
# Model.histogram(:my_agg, {field: 'field_name', interval: 5}, aggs: {...})
|
365
|
+
#
|
366
|
+
# Returns a new Stretchy::Relation.
|
367
|
+
def histogram(name, options = {}, *aggs)
|
368
|
+
options = {histogram: options}.merge(*aggs)
|
369
|
+
aggregation(name, options)
|
370
|
+
end
|
371
|
+
|
372
|
+
# Public: Perform an ip_range aggregation.
|
373
|
+
#
|
374
|
+
# name - The Symbol or String name of the aggregation.
|
375
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
376
|
+
# :field - The field to use for the ip_range aggregation.
|
377
|
+
# :ranges - The ranges to use for the ip_range aggregation. ranges: [{to: '10.0.0.5'}, {from: '10.0.0.5'}]
|
378
|
+
# aggs - The Array of additional nested aggregations (optional).
|
379
|
+
#
|
380
|
+
# Examples
|
381
|
+
#
|
382
|
+
# Model.ip_range(:my_agg, {field: 'ip_field'})
|
383
|
+
# Model.ip_range(:my_agg, {field: 'ip_field'}, aggs: {...})
|
384
|
+
#
|
385
|
+
# Returns a new Stretchy::Relation.
|
386
|
+
def ip_range(name, options = {}, *aggs)
|
387
|
+
options = {ip_range: options}.merge(*aggs)
|
388
|
+
aggregation(name, options)
|
389
|
+
end
|
390
|
+
|
391
|
+
# Public: Perform a max aggregation.
|
392
|
+
#
|
393
|
+
# name - The Symbol or String name of the aggregation.
|
394
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
395
|
+
# :field - The field to use for the max aggregation.
|
396
|
+
# aggs - The Array of additional nested aggregations (optional).
|
397
|
+
#
|
398
|
+
# Examples
|
399
|
+
#
|
400
|
+
# Model.max(:my_agg, {field: 'field_name'})
|
401
|
+
# Model.max(:my_agg, {field: 'field_name'}, aggs: {...})
|
402
|
+
#
|
403
|
+
# Returns a new Stretchy::Relation.
|
404
|
+
def max(name, options = {}, *aggs)
|
405
|
+
options = {max: options}.merge(*aggs)
|
406
|
+
aggregation(name, options)
|
407
|
+
end
|
408
|
+
|
409
|
+
# Public: Perform a min aggregation.
|
410
|
+
#
|
411
|
+
# name - The Symbol or String name of the aggregation.
|
412
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
413
|
+
# :field - The field to use for the min aggregation.
|
414
|
+
# aggs - The Array of additional nested aggregations (optional).
|
415
|
+
#
|
416
|
+
# Examples
|
417
|
+
#
|
418
|
+
# Model.min(:my_agg, {field: 'field_name'})
|
419
|
+
# Model.min(:my_agg, {field: 'field_name'}, aggs: {...})
|
420
|
+
#
|
421
|
+
# Returns a new Stretchy::Relation.
|
422
|
+
def min(name, options = {}, *aggs)
|
423
|
+
options = {min: options}.merge(*aggs)
|
424
|
+
aggregation(name, options)
|
425
|
+
end
|
426
|
+
|
427
|
+
# Public: Perform a missing aggregation.
|
428
|
+
#
|
429
|
+
# name - The Symbol or String name of the aggregation.
|
430
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
431
|
+
# :field - The field to use for the missing aggregation.
|
432
|
+
# aggs - The Array of additional nested aggregations (optional).
|
433
|
+
#
|
434
|
+
# Examples
|
435
|
+
#
|
436
|
+
# Model.missing(:my_agg, {field: 'field_name'})
|
437
|
+
# Model.missing(:my_agg, {field: 'field_name'}, aggs: {...})
|
438
|
+
#
|
439
|
+
# Returns a new Stretchy::Relation.
|
440
|
+
def missing(name, options = {}, *aggs)
|
441
|
+
options = {missing: options}.merge(*aggs)
|
442
|
+
aggregation(name, options)
|
443
|
+
end
|
444
|
+
|
445
|
+
# Public: Perform a nested aggregation.
|
446
|
+
#
|
447
|
+
# name - The Symbol or String name of the aggregation.
|
448
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
449
|
+
# :path - The path to use for the nested aggregation.
|
450
|
+
# aggs - The Array of additional nested aggregations (optional).
|
451
|
+
#
|
452
|
+
# Examples
|
453
|
+
#
|
454
|
+
# Model.nested(:my_agg, {path: 'path_to_field'})
|
455
|
+
# Model.nested(:my_agg, {path: 'path_to_field'}, aggs: {...})
|
456
|
+
#
|
457
|
+
# Returns a new Stretchy::Relation.
|
458
|
+
def nested(name, options = {}, *aggs)
|
459
|
+
options = {nested: options}.merge(*aggs)
|
460
|
+
aggregation(name, options)
|
461
|
+
end
|
462
|
+
|
463
|
+
# Public: Perform a percentile_ranks aggregation.
|
464
|
+
#
|
465
|
+
# name - The Symbol or String name of the aggregation.
|
466
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
467
|
+
# :field - The field to use for the percentile_ranks aggregation.
|
468
|
+
# :values - The values to use for the percentile_ranks aggregation.
|
469
|
+
# :keyed - associates a unique string key with each bucket and returns the ranges as a hash rather than an array. default: true
|
470
|
+
# :script - The script to use for the percentile_ranks aggregation. (optional) script: {source: "doc['field_name'].value", lang: "painless"}
|
471
|
+
# :hdr - The hdr to use for the percentile_ranks aggregation. (optional) hdr: {number_of_significant_value_digits: 3}
|
472
|
+
# :missing - The missing to use for the percentile_ranks aggregation. (optional) missing: 10
|
473
|
+
# aggs - The Array of additional nested aggregations (optional).
|
474
|
+
#
|
475
|
+
# Examples
|
476
|
+
#
|
477
|
+
# Model.percentile_ranks(:my_agg, {field: 'field_name', values: [1, 2, 3]})
|
478
|
+
# Model.percentile_ranks(:my_agg, {field: 'field_name', values: [1, 2, 3]}, aggs: {...})
|
479
|
+
#
|
480
|
+
# Returns a new Stretchy::Relation.
|
481
|
+
def percentile_ranks(name, options = {}, *aggs)
|
482
|
+
options = {percentile_ranks: options}.merge(*aggs)
|
483
|
+
aggregation(name, options)
|
484
|
+
end
|
485
|
+
|
486
|
+
# Public: Perform a percentiles aggregation.
|
487
|
+
#
|
488
|
+
# name - The Symbol or String name of the aggregation.
|
489
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
490
|
+
# :field - The field to use for the percentiles aggregation.
|
491
|
+
# :percents - The percents to use for the percentiles aggregation. percents: [95, 99, 99.9]
|
492
|
+
# :keyed - associates a unique string key with each bucket and returns the ranges as a hash rather than an array. default: true
|
493
|
+
# :tdigest - The tdigest to use for the percentiles aggregation. (optional) tdigest: {compression: 100, execution_hint: "high_accuracy"}
|
494
|
+
# :compression - The compression factor to use for the t-digest algorithm. A higher compression factor will yield more accurate percentiles, but will require more memory. The default value is 100.
|
495
|
+
# :execution_hint - The execution_hint to use for the t-digest algorithm. (optional) execution_hint: "auto"
|
496
|
+
# aggs - The Array of additional nested aggregations (optional).
|
497
|
+
#
|
498
|
+
# Examples
|
499
|
+
#
|
500
|
+
# Model.percentiles(:my_agg, {field: 'field_name', percents: [1, 2, 3]})
|
501
|
+
# Model.percentiles(:my_agg, {field: 'field_name', percents: [1, 2, 3]}, aggs: {...})
|
502
|
+
#
|
503
|
+
# Returns a new Stretchy::Relation.
|
504
|
+
def percentiles(name, options = {}, *aggs)
|
505
|
+
options = {percentiles: options}.merge(*aggs)
|
506
|
+
aggregation(name, options)
|
507
|
+
end
|
508
|
+
|
509
|
+
# Public: Perform a range aggregation.
|
510
|
+
#
|
511
|
+
# name - The Symbol or String name of the aggregation.
|
512
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
513
|
+
# :field - The field to use for the range aggregation.
|
514
|
+
# :ranges - The ranges to use for the range aggregation.
|
515
|
+
# :keyed - associates a unique string key with each bucket and returns the ranges as a hash rather than an array. default: true
|
516
|
+
# aggs - The Array of additional nested aggregations (optional).
|
517
|
+
#
|
518
|
+
# Examples
|
519
|
+
#
|
520
|
+
# Model.range(:my_agg, {field: 'field_name', ranges: [{from: 1, to: 2}, {from: 2, to: 3}]})
|
521
|
+
# Model.range(:my_agg, {field: 'field_name', ranges: [{from: 1, to: 2}, {from: 2, to: 3}]}, aggs: {...})
|
522
|
+
#
|
523
|
+
# Returns a new Stretchy::Relation.
|
524
|
+
def range(name, options = {}, *aggs)
|
525
|
+
options = {range: options}.merge(*aggs)
|
526
|
+
aggregation(name, options)
|
527
|
+
end
|
528
|
+
|
529
|
+
# Public: Perform a reverse_nested aggregation.
|
530
|
+
#
|
531
|
+
# name - The Symbol or String name of the aggregation.
|
532
|
+
# options - The Hash options used to refine the aggregation (default: {}).
|
533
|
+
# aggs - The Array of additional nested aggregations (optional).
|
534
|
+
#
|
535
|
+
# Examples
|
536
|
+
#
|
537
|
+
# Model.reverse_nested(:my_agg)
|
538
|
+
# Model.reverse_nested(:my_agg, {}, aggs: {...})
|
539
|
+
#
|
540
|
+
# Returns a new Stretchy::Relation.
|
541
|
+
def reverse_nested(name, options = {}, *aggs)
|
542
|
+
options = {reverse_nested: options}.merge(*aggs)
|
543
|
+
aggregation(name, options)
|
544
|
+
end
|
545
|
+
|
546
|
+
# Public: Perform a sampler aggregation.
|
547
|
+
#
|
548
|
+
# name - The Symbol or String name of the aggregation.
|
549
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
550
|
+
# :shard_size - The shard size to use for the sampler aggregation.
|
551
|
+
# aggs - The Array of additional nested aggregations (optional).
|
552
|
+
#
|
553
|
+
# Examples
|
554
|
+
#
|
555
|
+
# Model.sampler(:my_agg, {shard_size: 100})
|
556
|
+
# Model.sampler(:my_agg, {shard_size: 100}, aggs: {...})
|
557
|
+
#
|
558
|
+
# Returns a new Stretchy::Relation.
|
559
|
+
def sampler(name, options = {}, *aggs)
|
560
|
+
options = {sampler: options}.merge(*aggs)
|
561
|
+
aggregation(name, options)
|
562
|
+
end
|
563
|
+
|
564
|
+
# Public: Perform a scripted_metric aggregation.
|
565
|
+
#
|
566
|
+
# name - The Symbol or String name of the aggregation.
|
567
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
568
|
+
# :init_script - The initialization script for the scripted_metric aggregation.
|
569
|
+
# :map_script - The map script for the scripted_metric aggregation.
|
570
|
+
# :combine_script - The combine script for the scripted_metric aggregation.
|
571
|
+
# :reduce_script - The reduce script for the scripted_metric aggregation.
|
572
|
+
# aggs - The Array of additional nested aggregations (optional).
|
573
|
+
#
|
574
|
+
# Examples
|
575
|
+
#
|
576
|
+
# Model.scripted_metric(:my_agg, {init_script: '...', map_script: '...', combine_script: '...', reduce_script: '...'})
|
577
|
+
# Model.scripted_metric(:my_agg, {init_script: '...', map_script: '...', combine_script: '...', reduce_script: '...'}, aggs: {...})
|
578
|
+
#
|
579
|
+
# Returns a new Stretchy::Relation.
|
580
|
+
def scripted_metric(name, options = {}, *aggs)
|
581
|
+
options = {scripted_metric: options}.merge(*aggs)
|
582
|
+
aggregation(name, options)
|
583
|
+
end
|
584
|
+
|
585
|
+
# Public: Perform a significant_terms aggregation.
|
586
|
+
#
|
587
|
+
# name - The Symbol or String name of the aggregation.
|
588
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
589
|
+
# :field - The field to use for the significant_terms aggregation.
|
590
|
+
# :background_filter - The background filter to use for the significant_terms aggregation.
|
591
|
+
# :mutual_information - The mutual information to use for the significant_terms aggregation.
|
592
|
+
# :chi_square - The chi square to use for the significant_terms aggregation.
|
593
|
+
# :gnd - The gnd to use for the significant_terms aggregation.
|
594
|
+
# :jlh - The jlh to use for the significant_terms aggregation.
|
595
|
+
# aggs - The Array of additional nested aggregations (optional).
|
596
|
+
#
|
597
|
+
# Examples
|
598
|
+
#
|
599
|
+
# Model.significant_terms(:my_agg, {field: 'field_name'})
|
600
|
+
# Model.significant_terms(:my_agg, {field: 'field_name'}, aggs: {...})
|
601
|
+
#
|
602
|
+
# Returns a new Stretchy::Relation.
|
603
|
+
def significant_terms(name, options = {}, *aggs)
|
604
|
+
options = {significant_terms: options}.merge(*aggs)
|
605
|
+
aggregation(name, options)
|
606
|
+
end
|
607
|
+
|
608
|
+
# Public: Perform a stats aggregation.
|
609
|
+
#
|
610
|
+
# name - The Symbol or String name of the aggregation.
|
611
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
612
|
+
# :field - The field to use for the stats aggregation.
|
613
|
+
# :missing - The missing to use for the stats aggregation.
|
614
|
+
# :script - The script to use for the stats aggregation.
|
615
|
+
# aggs - The Array of additional nested aggregations (optional).
|
616
|
+
#
|
617
|
+
# Examples
|
618
|
+
#
|
619
|
+
# Model.stats(:my_agg, {field: 'field_name'})
|
620
|
+
# Model.stats(:my_agg, {field: 'field_name'}, aggs: {...})
|
621
|
+
#
|
622
|
+
# Returns a new Stretchy::Relation.
|
623
|
+
def stats(name, options = {}, *aggs)
|
624
|
+
options = {stats: options}.merge(*aggs)
|
625
|
+
aggregation(name, options)
|
626
|
+
end
|
627
|
+
|
628
|
+
# Public: Perform a sum aggregation.
|
629
|
+
#
|
630
|
+
# name - The Symbol or String name of the aggregation.
|
631
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
632
|
+
# :field - The field to use for the sum aggregation.
|
633
|
+
# :missing - The missing to use for the sum aggregation.
|
634
|
+
# :script - The script to use for the sum aggregation.
|
635
|
+
# aggs - The Array of additional nested aggregations (optional).
|
636
|
+
#
|
637
|
+
# Examples
|
638
|
+
#
|
639
|
+
# Model.sum(:my_agg, {field: 'field_name'})
|
640
|
+
# Model.sum(:my_agg, {field: 'field_name'}, aggs: {...})
|
641
|
+
#
|
642
|
+
# Returns a new Stretchy::Relation.
|
643
|
+
def sum(name, options = {}, *aggs)
|
644
|
+
options = {sum: options}.merge(*aggs)
|
645
|
+
aggregation(name, options)
|
646
|
+
end
|
647
|
+
|
648
|
+
# Public: Perform a terms aggregation.
|
649
|
+
#
|
650
|
+
# name - The Symbol or String name of the aggregation.
|
651
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
652
|
+
# :field - The field to use for the terms aggregation.
|
653
|
+
# :size - The size for the terms aggregation. (optional)
|
654
|
+
# :min_doc_count - The minimum document count for the terms aggregation. (optional)
|
655
|
+
# :shard_min_doc_count - The shard minimum document count for the terms aggregation. (optional)
|
656
|
+
# :show_term_doc_count_error - The show_term_doc_count_error for the terms aggregation. (optional) default: false
|
657
|
+
# :shard_size - The shard size for the terms aggregation. (optional)
|
658
|
+
# :order - The order for the terms aggregation. (optional)
|
659
|
+
#
|
660
|
+
# aggs - The Array of additional nested aggregations (optional).
|
661
|
+
#
|
662
|
+
# Examples
|
663
|
+
#
|
664
|
+
# Model.terms(:my_agg, {field: 'field_name', size: 10, min_doc_count: 1, shard_size: 100})
|
665
|
+
# Model.terms(:my_agg, {field: 'field_name', size: 10, min_doc_count: 1, shard_size: 100}, aggs: {...})
|
666
|
+
#
|
667
|
+
# Returns a new Stretchy::Relation.
|
668
|
+
def terms(name, options = {}, *aggs)
|
669
|
+
options = {terms: options}.merge(*aggs)
|
670
|
+
aggregation(name, options)
|
671
|
+
end
|
672
|
+
|
673
|
+
|
674
|
+
# Public: Perform a top_hits aggregation.
|
675
|
+
#
|
676
|
+
# name - The Symbol or String name of the aggregation.
|
677
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
678
|
+
# :size - The size for the top_hits aggregation.
|
679
|
+
# :from - The from for the top_hits aggregation.
|
680
|
+
# :sort - The sort for the top_hits aggregation.
|
681
|
+
# aggs - The Array of additional nested aggregations (optional).
|
682
|
+
#
|
683
|
+
# Examples
|
684
|
+
#
|
685
|
+
# Model.top_hits(:my_agg, {size: 10, sort: {...}})
|
686
|
+
# Model.top_hits(:my_agg, {size: 10, sort: {...}}, aggs: {...})
|
687
|
+
#
|
688
|
+
# Returns a new Stretchy::Relation.
|
689
|
+
def top_hits(name, options = {}, *aggs)
|
690
|
+
options = {top_hits: options}.merge(*aggs)
|
691
|
+
aggregation(name, options)
|
692
|
+
end
|
693
|
+
|
694
|
+
# Public: Perform a top_metrics aggregation.
|
695
|
+
#
|
696
|
+
# name - The Symbol or String name of the aggregation.
|
697
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
698
|
+
# :metrics - The metrics to use for the top_metrics aggregation. metrics: [{field: 'field_name', type: 'max'}, {field: 'field_name', type: 'min']
|
699
|
+
# :field - The field to use for the top_metrics aggregation. (optional)
|
700
|
+
# :size - The size for the top_metrics aggregation. (optional)
|
701
|
+
# :sort - The sort for the top_metrics aggregation. (optional)
|
702
|
+
# :missing - The missing for the top_metrics aggregation. (optional)
|
703
|
+
# aggs - The Array of additional nested aggregations (optional).
|
704
|
+
#
|
705
|
+
# Examples
|
706
|
+
#
|
707
|
+
# Model.top_metrics(:my_agg, {metrics: ['metric1', 'metric2']})
|
708
|
+
# Model.top_metrics(:my_agg, {metrics: ['metric1', 'metric2']}, aggs: {...})
|
709
|
+
#
|
710
|
+
# Returns a new Stretchy::Relation.
|
711
|
+
def top_metrics(name, options = {}, *aggs)
|
712
|
+
options = {top_metrics: options}.merge(*aggs)
|
713
|
+
aggregation(name, options)
|
714
|
+
end
|
715
|
+
|
716
|
+
# Public: Perform a value_count aggregation.
|
717
|
+
#
|
718
|
+
# name - The Symbol or String name of the aggregation.
|
719
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
720
|
+
# :field - The field to use for the value_count aggregation.
|
721
|
+
# :script - The script to use for the value_count aggregation. (optional) script: {source: "doc['field_name'].value", lang: "painless"}
|
722
|
+
# aggs - The Array of additional nested aggregations (optional).
|
723
|
+
#
|
724
|
+
# Examples
|
725
|
+
#
|
726
|
+
# Model.value_count(:my_agg, {field: 'field_name'})
|
727
|
+
# Model.value_count(:my_agg, {field: 'field_name'}, aggs: {...})
|
728
|
+
#
|
729
|
+
# Returns a new Stretchy::Relation.
|
730
|
+
def value_count(name, options = {}, *aggs)
|
731
|
+
options = {value_count: options}.merge(*aggs)
|
732
|
+
aggregation(name, options)
|
733
|
+
end
|
734
|
+
|
735
|
+
# Public: Perform a weighted_avg aggregation.
|
736
|
+
#
|
737
|
+
# name - The Symbol or String name of the aggregation.
|
738
|
+
# options - The Hash options used to refine the aggregation (default: {}):
|
739
|
+
# :value - The value field to use for the weighted_avg aggregation. {value: { field: 'price', missing: 0}}
|
740
|
+
# :weight - The weight field to use for the weighted_avg aggregation. {weight: { field: 'weight', missing: 0}}
|
741
|
+
# :format - The format for the weighted_avg aggregation. (optional)
|
742
|
+
# aggs - The Array of additional nested aggregations (optional).
|
743
|
+
#
|
744
|
+
# Examples
|
745
|
+
#
|
746
|
+
# Model.weighted_avg(:my_agg, {value_field: 'value_field_name', weight_field: 'weight_field_name'})
|
747
|
+
# Model.weighted_avg(:my_agg, {value_field: 'value_field_name', weight_field: 'weight_field_name'}, aggs: {...})
|
748
|
+
#
|
749
|
+
# Returns a new Stretchy::Relation.
|
750
|
+
def weighted_avg(name, options = {}, *aggs)
|
751
|
+
options = {weighted_avg: options}.merge(*aggs)
|
752
|
+
aggregation(name, options)
|
753
|
+
end
|
754
|
+
|
755
|
+
|
756
|
+
end
|
757
|
+
end
|
758
|
+
end
|