es_query_builder 2.0.0 → 2.0.1
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/lib/aggregations/buckets/date_histogram_aggregation_builder.rb +64 -0
- data/lib/aggregations/buckets/date_range_aggregation_builder.rb +25 -0
- data/lib/aggregations/buckets/filter_aggregation_builder.rb +30 -0
- data/lib/aggregations/buckets/filters_aggregation_builder.rb +32 -0
- data/lib/aggregations/buckets/geo_grid_aggregation_builder.rb +50 -0
- data/lib/aggregations/buckets/histogram_aggregation_builder.rb +63 -0
- data/lib/aggregations/buckets/nested_aggregation_builder.rb +33 -0
- data/lib/aggregations/buckets/range_aggregation_builder.rb +25 -0
- data/lib/aggregations/buckets/reverse_nested_aggregation_builder.rb +23 -0
- data/lib/aggregations/buckets/terms_aggregation_builder.rb +87 -0
- data/lib/aggregations/buckets/top_hits_aggregation_builder.rb +78 -0
- data/lib/aggregations/helpers/abstract_aggregation_helper.rb +37 -0
- data/lib/aggregations/helpers/abstract_range_helper.rb +40 -0
- data/lib/aggregations/helpers/aggregation_query_builder_helper.rb +61 -0
- data/lib/aggregations/helpers/values_source_aggregation_helper.rb +53 -0
- data/lib/aggregations/metrics/avg_aggregation_builder.rb +24 -0
- data/lib/aggregations/metrics/max_aggregation_builder.rb +24 -0
- data/lib/aggregations/metrics/min_aggregation_builder.rb +24 -0
- data/lib/enums/combine_functions.rb +54 -0
- data/lib/enums/distance_types.rb +36 -0
- data/lib/enums/distance_units.rb +71 -0
- data/lib/enums/fuzziness.rb +56 -0
- data/lib/enums/orders.rb +17 -0
- data/lib/enums/score_modes.rb +54 -0
- data/lib/enums/script_sort_types.rb +32 -0
- data/lib/enums/script_types.rb +19 -0
- data/lib/enums/shape_relations.rb +47 -0
- data/lib/enums/sort_modes.rb +59 -0
- data/lib/enums/sort_orders.rb +33 -0
- data/lib/enums/validation_methods.rb +44 -0
- data/lib/enums/zero_terms_query.rb +37 -0
- data/lib/function_scores/random_score_function_builder.rb +53 -0
- data/lib/function_scores/score_function_builder.rb +19 -0
- data/lib/function_scores/script_score_function_builder.rb +30 -0
- data/lib/function_scores/weighted_score_function_builder.rb +38 -0
- data/lib/misc/bucket_order.rb +33 -0
- data/lib/misc/geo_point.rb +64 -0
- data/lib/misc/range.rb +44 -0
- data/lib/misc/script.rb +62 -0
- data/lib/misc/terms_lookup.rb +45 -0
- data/lib/queries/abstract_query_builder.rb +31 -0
- data/lib/queries/base_query_builder.rb +27 -0
- data/lib/queries/bool_query_builder.rb +148 -0
- data/lib/queries/constant_score_query_builder.rb +32 -0
- data/lib/queries/dis_max_query_builder.rb +70 -0
- data/lib/queries/exists_query_builder.rb +32 -0
- data/lib/queries/function_score_query_builder.rb +170 -0
- data/lib/queries/geo_distance_query_builder.rb +126 -0
- data/lib/queries/match_all_query_builder.rb +16 -0
- data/lib/queries/match_query_builder.rb +181 -0
- data/lib/queries/nested_query_builder.rb +55 -0
- data/lib/queries/nested_sort_query_builder.rb +44 -0
- data/lib/queries/query_builder.rb +33 -0
- data/lib/queries/range_query_builder.rb +153 -0
- data/lib/queries/term_query_builder.rb +44 -0
- data/lib/queries/terms_query_builder.rb +54 -0
- data/lib/sort/abstract_sort_builder.rb +15 -0
- data/lib/sort/field_sort_builder.rb +70 -0
- data/lib/sort/geo_distance_sort_builder.rb +120 -0
- data/lib/sort/nested_sort_builder.rb +68 -0
- data/lib/sort/score_sort_builder.rb +16 -0
- data/lib/sort/script_sort_builder.rb +83 -0
- data/lib/sort/sort_builder.rb +28 -0
- metadata +64 -1
@@ -0,0 +1,126 @@
|
|
1
|
+
# Filters documents that include only hits that exists within a specific distance from a geo point.
|
2
|
+
require_relative 'query_builder'
|
3
|
+
module Queries
|
4
|
+
class GeoDistanceQueryBuilder < QueryBuilder
|
5
|
+
|
6
|
+
NAME = 'geo_distance'
|
7
|
+
DEFAULT_DISTANCE_UNIT = ::Enums::DistanceUnits.meters
|
8
|
+
|
9
|
+
=begin
|
10
|
+
@params:
|
11
|
+
field_name: geo_point field in the document which is matched with the given query
|
12
|
+
point: center point for this query
|
13
|
+
distance: The radius of the circle centred on the specified location. Points which fall into this circle are considered to be matches.
|
14
|
+
distance_unit: The distance can be specified in various units. See Distance Units.
|
15
|
+
distance_type: How to compute the distance. Can either be arc (default),
|
16
|
+
or plane (faster, but inaccurate on long distances and close to the poles)
|
17
|
+
writable_name: Optional name field to identify the query
|
18
|
+
validation_method: Set to IGNORE_MALFORMED to accept geo points with invalid latitude or longitude,
|
19
|
+
set to COERCE to additionally try and infer correct coordinates (default is STRICT).
|
20
|
+
ignore_unmapped: When set to true the ignore_unmapped option will ignore an unmapped field and will not match any documents for this query.
|
21
|
+
When set to false (the default value) the query will throw an exception if the field is not mapped.
|
22
|
+
=end
|
23
|
+
|
24
|
+
def initialize field_name:
|
25
|
+
@field_name = field_name
|
26
|
+
@point = nil
|
27
|
+
@distance = nil
|
28
|
+
@distance_unit = DEFAULT_DISTANCE_UNIT.distance_unit
|
29
|
+
@distance_type = nil
|
30
|
+
@writable_name = nil
|
31
|
+
@validation_method = nil
|
32
|
+
@ignore_unmapped = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def query
|
36
|
+
query = {}
|
37
|
+
geo_query = self.common_query
|
38
|
+
geo_query[@field_name] = @point.settings
|
39
|
+
geo_query[:distance] = @distance.to_s + @distance_unit.to_s
|
40
|
+
geo_query[:distance_type] = @distance_type
|
41
|
+
geo_query[:writable_name] = @writable_name
|
42
|
+
geo_query[:validation_method] = @validation_method
|
43
|
+
geo_query[:ignore_unmapped] = @ignore_unmapped
|
44
|
+
query[name.intern] = geo_query
|
45
|
+
return query
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns point
|
49
|
+
def point_expr
|
50
|
+
return @point
|
51
|
+
end
|
52
|
+
|
53
|
+
# Sets point
|
54
|
+
def point point
|
55
|
+
@point = point
|
56
|
+
return self
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns field_name
|
60
|
+
def field_name_expr
|
61
|
+
return @field_name
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns distance
|
65
|
+
def distance_expr
|
66
|
+
return @distance
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns distance_unit
|
70
|
+
def distance_unit_expr
|
71
|
+
return @distance_unit
|
72
|
+
end
|
73
|
+
|
74
|
+
# Sets distance and distance_unit
|
75
|
+
def distance distance, distance_unit= nil
|
76
|
+
@distance = distance
|
77
|
+
@distance_unit = distance_unit.distance_unit if distance_unit.present?
|
78
|
+
return self
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns distance_type
|
82
|
+
def distance_type_expr
|
83
|
+
return @distance_type
|
84
|
+
end
|
85
|
+
|
86
|
+
# Sets distance_type
|
87
|
+
def distance_type distance_type
|
88
|
+
@distance_type = distance_type.distance_type
|
89
|
+
return self
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns writable_name
|
93
|
+
def writable_name_expr
|
94
|
+
return @writable_name
|
95
|
+
end
|
96
|
+
|
97
|
+
# Sets writable_name
|
98
|
+
def writable_name writable_name
|
99
|
+
@writable_name = writable_name
|
100
|
+
return self
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns validation_method
|
104
|
+
def validation_method_expr
|
105
|
+
return @validation_method
|
106
|
+
end
|
107
|
+
|
108
|
+
# Sets validation_method
|
109
|
+
def validation_method validation_method
|
110
|
+
@validation_method = validation_method.validation_method
|
111
|
+
return self
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns ignore_unmapped
|
115
|
+
def ignore_unmapped_expr
|
116
|
+
return @ignore_unmapped
|
117
|
+
end
|
118
|
+
|
119
|
+
# Sets ignore_unmapped
|
120
|
+
def ignore_unmapped ignore_unmapped
|
121
|
+
@ignore_unmapped = ignore_unmapped
|
122
|
+
return self
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# The most simple query, which matches all documents
|
2
|
+
require_relative 'query_builder'
|
3
|
+
module Queries
|
4
|
+
class MatchAllQueryBuilder < QueryBuilder
|
5
|
+
|
6
|
+
NAME = 'match_all'
|
7
|
+
|
8
|
+
def query
|
9
|
+
query = {}
|
10
|
+
matchall_query = self.common_query
|
11
|
+
query[name.intern] = matchall_query
|
12
|
+
return query
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
# Match query is a query that analyzes the text and constructs a query as the result of the analysis.
|
2
|
+
require_relative 'query_builder'
|
3
|
+
module Queries
|
4
|
+
class MatchQueryBuilder < QueryBuilder
|
5
|
+
=begin
|
6
|
+
@params: analyzer, auto_generate_synonyms_phrase_query, cutoff_frequency, field_name, fuzziness, fuzzy_transposition,
|
7
|
+
lenient, max_expansions, minimum_should_match, operator, prefix_length, value, zero_terms_query
|
8
|
+
analyzer: analyzer to be used for this query
|
9
|
+
auto_generate_synonyms_phrase_query: The match query supports multi-terms synonym expansion with the synonym_graph token filter.
|
10
|
+
When this filter is used, the parser creates a phrase query for each multi-terms synonyms.
|
11
|
+
For example, the following synonym: "ny, new york" would produce:
|
12
|
+
(ny OR ("new york"))
|
13
|
+
cutoff_frequency: cutoff value in [0..1] (or absolute number >=1) representing the maximum threshold of a terms document frequency
|
14
|
+
to be considered a low frequency term.
|
15
|
+
field_name: name of the field to be queried
|
16
|
+
fuzziness: fuzziness used when evaluated to a fuzzy query type
|
17
|
+
fuzzy_transposition: fuzzy transpositions (ab → ba) are allowed by default but can be disabled by setting fuzzy_transpositions to false
|
18
|
+
max_expansions: max_expansions limit the number of matching docs that will be returned
|
19
|
+
minimum_should_match: minimum number of cases to match in case of or query
|
20
|
+
value: value to be matched in that field in the documents
|
21
|
+
zero_terms_query: If the analyzer used removes all tokens in a query like a stop filter does, the default behavior is to match no documents at all.
|
22
|
+
In order to change that the zero_terms_query option can be used, which accepts none (default) and all which corresponds to a match_all query.
|
23
|
+
fuzzy_prefix_length: prefix length provides the number of characters from beginning that have to be exactly matched
|
24
|
+
=end
|
25
|
+
|
26
|
+
NAME = "match"
|
27
|
+
|
28
|
+
def initialize field_name: , value: nil
|
29
|
+
@field_name = field_name
|
30
|
+
@value = value
|
31
|
+
@zero_terms_query = nil
|
32
|
+
@analyzer = nil
|
33
|
+
@auto_generate_synonyms_phrase_query = nil
|
34
|
+
@cutoff_frequency = nil
|
35
|
+
@fuzziness = nil
|
36
|
+
@fuzzy_transpositions = nil
|
37
|
+
@max_expansions = nil
|
38
|
+
@minimum_should_match = nil
|
39
|
+
@operator = nil
|
40
|
+
@prefix_length = nil
|
41
|
+
@zero_terms_query = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def query
|
45
|
+
query = {}
|
46
|
+
match_query = {}
|
47
|
+
field_options = self.common_query
|
48
|
+
field_options[:query] = @value
|
49
|
+
field_options[:operator] = @operator if @operator.present?
|
50
|
+
field_options[:analyzer] = @analyzer if @analyzer.present?
|
51
|
+
field_options[:auto_generate_synonyms_phrase_query] = @auto_generate_synonyms_phrase_query if @auto_generate_synonyms_phrase_query.present?
|
52
|
+
field_options[:cutoff_frequency] = @cutoff_frequency if @cutoff_frequency.present?
|
53
|
+
field_options[:fuzzy_prefix_length] = @fuzzy_prefix_length if @fuzzy_prefix_length.present?
|
54
|
+
field_options[:max_expansions] = @max_expansions if @max_expansions.present?
|
55
|
+
field_options[:fuzzy_transpositions] = @fuzzy_transpositions if @fuzzy_transpositions.present?
|
56
|
+
field_options[:minimum_should_match] = @minimum_should_match if @minimum_should_match.present?
|
57
|
+
field_options[:zero_terms_query] = @zero_terms_query if @zero_terms_query.present?
|
58
|
+
field_options[:fuzziness] = @fuzziness if @fuzziness.present?
|
59
|
+
match_query[@field_name.to_s.intern] = field_options
|
60
|
+
query[name.intern] = match_query
|
61
|
+
return query
|
62
|
+
end
|
63
|
+
|
64
|
+
########## FIELD NAME ##########
|
65
|
+
# returns field_name
|
66
|
+
def field_name_expr
|
67
|
+
return @field_name
|
68
|
+
end
|
69
|
+
|
70
|
+
########## FIELD VALUE ##########
|
71
|
+
# returns value
|
72
|
+
def value_expr
|
73
|
+
return @value
|
74
|
+
end
|
75
|
+
|
76
|
+
########## SEARCH ANALYZER ##########
|
77
|
+
# return analyzer
|
78
|
+
def analyzer_expr
|
79
|
+
return @analyzer
|
80
|
+
end
|
81
|
+
# sets analyzer
|
82
|
+
def analyzer value
|
83
|
+
@analyzer = value
|
84
|
+
return self
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
########## AUTO GENERATE SYNONYMS PHRASE QUERY ##########
|
89
|
+
# returns auto_generate_synonyms_phrase_query
|
90
|
+
def auto_generate_synonyms_phrase_query_expr
|
91
|
+
return @auto_generate_synonyms_phrase_query
|
92
|
+
end
|
93
|
+
# sets auto_generate_synonyms_phrase_query
|
94
|
+
def auto_generate_synonyms_phrase_query value
|
95
|
+
@auto_generate_synonyms_phrase_query = value
|
96
|
+
return self
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
########## CUTOFF FREQUENCY ##########
|
101
|
+
# returns cutoff_frequency
|
102
|
+
def cutoff_frequency_expr
|
103
|
+
return @cutoff_frequency
|
104
|
+
end
|
105
|
+
# sets cutoff_frequency
|
106
|
+
def cutoff_frequency value
|
107
|
+
@cutoff_frequency = value
|
108
|
+
return self
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
########## FUZZINESS VALUE ##########
|
113
|
+
# returns fuzziness
|
114
|
+
def fuzziness_expr
|
115
|
+
return @fuzziness
|
116
|
+
end
|
117
|
+
# sets fuzziness
|
118
|
+
def fuzziness fuzziness
|
119
|
+
@fuzziness = fuzziness.fuzziness
|
120
|
+
return self
|
121
|
+
end
|
122
|
+
|
123
|
+
########## PREFIX LENGTH ########
|
124
|
+
# returns prefix_length
|
125
|
+
def fuzzy_prefix_length_expr
|
126
|
+
return @prefix_length
|
127
|
+
end
|
128
|
+
# sets prefix_length
|
129
|
+
def fuzzy_prefix_length value
|
130
|
+
@prefix_length = value
|
131
|
+
return self
|
132
|
+
end
|
133
|
+
|
134
|
+
########## MAX EXPANSIONS ##########
|
135
|
+
# returns max_expansions
|
136
|
+
def max_expansions_expr
|
137
|
+
return @max_expansions
|
138
|
+
end
|
139
|
+
# sets max_expansions
|
140
|
+
def max_expansions value
|
141
|
+
@max_expansions = value
|
142
|
+
return self
|
143
|
+
end
|
144
|
+
|
145
|
+
########## FUZZY TRANSPOSITIONS ##########
|
146
|
+
# returns fuzzy_transpositions
|
147
|
+
def fuzzy_transpositions_expr
|
148
|
+
return @fuzzy_transpositions
|
149
|
+
end
|
150
|
+
# sets fuzzy_transpositions
|
151
|
+
def fuzzy_transpositions value
|
152
|
+
@fuzzy_transpositions = value
|
153
|
+
return self
|
154
|
+
end
|
155
|
+
|
156
|
+
########## MINIMUM SHOULD ##########
|
157
|
+
# returns minimum_should_match
|
158
|
+
def minimum_should_match_expr
|
159
|
+
return @minimum_should_match
|
160
|
+
end
|
161
|
+
# sets minimum_should_match
|
162
|
+
def minimum_should_match value
|
163
|
+
@minimum_should_match = value
|
164
|
+
return self
|
165
|
+
end
|
166
|
+
|
167
|
+
########## ZERO TERMS ##########
|
168
|
+
# returns zero_terms_query
|
169
|
+
def zero_terms_query_expr
|
170
|
+
return @zero_terms_query
|
171
|
+
end
|
172
|
+
# sets zero_terms_query
|
173
|
+
def zero_terms_query zero_terms_query
|
174
|
+
@zero_terms_query = zero_terms_query.zero_term
|
175
|
+
return self
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
=begin
|
2
|
+
Nested query allows to query nested objects / docs (see nested mapping). The query is executed against the nested objects / docs
|
3
|
+
as if they were indexed as separate docs (they are, internally) and resulting in the root parent doc (or parent nested mapping).
|
4
|
+
=end
|
5
|
+
require_relative 'query_builder'
|
6
|
+
module Queries
|
7
|
+
class NestedQueryBuilder < QueryBuilder
|
8
|
+
|
9
|
+
NAME = "nested"
|
10
|
+
|
11
|
+
attr_reader :path, :inner_query, :score_mode
|
12
|
+
|
13
|
+
=begin
|
14
|
+
@params:
|
15
|
+
path: The query path points to the nested object path.
|
16
|
+
score_mode: The score_mode allows to set how inner children matching affects scoring of parent.
|
17
|
+
It defaults to avg, but can be sum, min, max and none.
|
18
|
+
inner_query: query includes the query that will run on the nested docs matching the direct path, and joining with the root parent docs
|
19
|
+
|
20
|
+
Any fields referenced inside the query must use the complete path (fully qualified)
|
21
|
+
=end
|
22
|
+
def initialize path:, inner_query:, score_mode: nil, type: :query
|
23
|
+
@path = path
|
24
|
+
@inner_query = inner_query
|
25
|
+
@score_mode = score_mode.score_mode if score_mode.present?
|
26
|
+
@type = type
|
27
|
+
end
|
28
|
+
|
29
|
+
def query
|
30
|
+
query = {}
|
31
|
+
nested_query = self.common_query
|
32
|
+
nested_query[:path] = @path if @path.present?
|
33
|
+
nested_query[@type] = @inner_query.query if @inner_query.present?
|
34
|
+
nested_query[:score_mode] = @score_mode if @score_mode.present?
|
35
|
+
query[name.intern] = nested_query
|
36
|
+
return query
|
37
|
+
end
|
38
|
+
|
39
|
+
# returns path
|
40
|
+
def path_expr
|
41
|
+
return @path
|
42
|
+
end
|
43
|
+
|
44
|
+
# returns inner_query
|
45
|
+
def inner_query_expr
|
46
|
+
return @inner_query
|
47
|
+
end
|
48
|
+
|
49
|
+
# returns score_mode
|
50
|
+
def score_mode_expr
|
51
|
+
return @score_mode
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'query_builder'
|
2
|
+
module Queries
|
3
|
+
class NestedSortQueryBuilder < QueryBuilder
|
4
|
+
|
5
|
+
NAME = "nested"
|
6
|
+
|
7
|
+
attr_reader :path, :inner_query
|
8
|
+
|
9
|
+
=begin
|
10
|
+
@params:
|
11
|
+
path: The query path points to the nested object path.
|
12
|
+
inner_query: query includes the query that will run on the nested docs matching the direct path, and joining with the root parent docs
|
13
|
+
|
14
|
+
Any fields referenced inside the query must use the complete path (fully qualified)
|
15
|
+
=end
|
16
|
+
def initialize path:, inner_query:
|
17
|
+
@path = path
|
18
|
+
@inner_query = inner_query
|
19
|
+
end
|
20
|
+
|
21
|
+
def query
|
22
|
+
nested_query = self.common_query
|
23
|
+
nested_query[:path] = @path if @path.present?
|
24
|
+
nested_query[:filter] = @inner_query.query if @inner_query.present?
|
25
|
+
return nested_query
|
26
|
+
end
|
27
|
+
|
28
|
+
# returns path
|
29
|
+
def path_expr
|
30
|
+
return @path
|
31
|
+
end
|
32
|
+
|
33
|
+
# returns inner_query
|
34
|
+
def inner_query_expr
|
35
|
+
return @inner_query
|
36
|
+
end
|
37
|
+
|
38
|
+
# returns score_mode
|
39
|
+
def score_mode_expr
|
40
|
+
return @score_mode
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'abstract_query_builder'
|
4
|
+
require_relative '../attributes_reader'
|
5
|
+
module Queries
|
6
|
+
# Base Class for all query classes
|
7
|
+
# QueryComponents
|
8
|
+
# boost: documents matching the query are boosted by
|
9
|
+
# the value
|
10
|
+
class QueryBuilder
|
11
|
+
include AbstractQueryBuilder
|
12
|
+
include AttributesReader
|
13
|
+
|
14
|
+
NAME = 'base'
|
15
|
+
|
16
|
+
# @!visibility protected
|
17
|
+
# @return [Numeric] the boost for this query
|
18
|
+
def boost_expr
|
19
|
+
@boost
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [Numeric]
|
23
|
+
# value boost value for the query
|
24
|
+
# @return [QueryBuilder] modified self
|
25
|
+
# sets the boost value for this query
|
26
|
+
def boost(value)
|
27
|
+
raise 'boost value is nil' if value.nil?
|
28
|
+
|
29
|
+
@boost = value
|
30
|
+
self
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|