mm_es_search 0.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.
- data/.gitignore +4 -0
- data/.project +18 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/mm_es_search/api/facet/abstract_facet.rb +28 -0
- data/lib/mm_es_search/api/facet/date_histogram_facet.rb +11 -0
- data/lib/mm_es_search/api/facet/filter_facet.rb +9 -0
- data/lib/mm_es_search/api/facet/geo_distance_facet.rb +9 -0
- data/lib/mm_es_search/api/facet/histogram_facet.rb +9 -0
- data/lib/mm_es_search/api/facet/query_facet.rb +9 -0
- data/lib/mm_es_search/api/facet/range_facet.rb +36 -0
- data/lib/mm_es_search/api/facet/range_facet_row.rb +97 -0
- data/lib/mm_es_search/api/facet/range_item.rb +17 -0
- data/lib/mm_es_search/api/facet/statistical_facet.rb +33 -0
- data/lib/mm_es_search/api/facet/statistical_facet_result.rb +36 -0
- data/lib/mm_es_search/api/facet/terms_facet.rb +62 -0
- data/lib/mm_es_search/api/facet/terms_facet_row.rb +35 -0
- data/lib/mm_es_search/api/facet/terms_stats_facet.rb +9 -0
- data/lib/mm_es_search/api/highlight/result_highlight.rb +40 -0
- data/lib/mm_es_search/api/query/abstract_filter.rb +15 -0
- data/lib/mm_es_search/api/query/abstract_query.rb +48 -0
- data/lib/mm_es_search/api/query/and_filter.rb +9 -0
- data/lib/mm_es_search/api/query/bool_filter.rb +11 -0
- data/lib/mm_es_search/api/query/bool_query.rb +67 -0
- data/lib/mm_es_search/api/query/constant_score_query.rb +31 -0
- data/lib/mm_es_search/api/query/custom_filters_score_query.rb +52 -0
- data/lib/mm_es_search/api/query/custom_score_query.rb +31 -0
- data/lib/mm_es_search/api/query/dismax_query.rb +29 -0
- data/lib/mm_es_search/api/query/filtered_query.rb +30 -0
- data/lib/mm_es_search/api/query/has_child_filter.rb +11 -0
- data/lib/mm_es_search/api/query/has_child_query.rb +25 -0
- data/lib/mm_es_search/api/query/has_parent_filter.rb +11 -0
- data/lib/mm_es_search/api/query/has_parent_query.rb +25 -0
- data/lib/mm_es_search/api/query/match_all_filter.rb +11 -0
- data/lib/mm_es_search/api/query/match_all_query.rb +19 -0
- data/lib/mm_es_search/api/query/nested_filter.rb +22 -0
- data/lib/mm_es_search/api/query/nested_query.rb +62 -0
- data/lib/mm_es_search/api/query/not_filter.rb +9 -0
- data/lib/mm_es_search/api/query/or_filter.rb +9 -0
- data/lib/mm_es_search/api/query/prefix_filter.rb +11 -0
- data/lib/mm_es_search/api/query/prefix_query.rb +34 -0
- data/lib/mm_es_search/api/query/query_filter.rb +28 -0
- data/lib/mm_es_search/api/query/query_string_query.rb +37 -0
- data/lib/mm_es_search/api/query/range_filter.rb +11 -0
- data/lib/mm_es_search/api/query/range_query.rb +57 -0
- data/lib/mm_es_search/api/query/scored_filter.rb +29 -0
- data/lib/mm_es_search/api/query/single_bool_filter.rb +66 -0
- data/lib/mm_es_search/api/query/term_filter.rb +11 -0
- data/lib/mm_es_search/api/query/term_query.rb +34 -0
- data/lib/mm_es_search/api/query/terms_filter.rb +11 -0
- data/lib/mm_es_search/api/query/terms_query.rb +58 -0
- data/lib/mm_es_search/api/query/text_query.rb +42 -0
- data/lib/mm_es_search/api/query/top_children_query.rb +28 -0
- data/lib/mm_es_search/api/sort/root_sort.rb +36 -0
- data/lib/mm_es_search/models/abstract_facet_model.rb +23 -0
- data/lib/mm_es_search/models/abstract_query_model.rb +21 -0
- data/lib/mm_es_search/models/abstract_range_facet_model.rb +365 -0
- data/lib/mm_es_search/models/abstract_search_model.OLD +538 -0
- data/lib/mm_es_search/models/abstract_search_model.rb +521 -0
- data/lib/mm_es_search/models/abstract_sort_model.rb +13 -0
- data/lib/mm_es_search/models/abstract_terms_facet_model.rb +87 -0
- data/lib/mm_es_search/models/root_sort_model.rb +20 -0
- data/lib/mm_es_search/models/virtual_field_sort.rb +52 -0
- data/lib/mm_es_search/utils/facet_row_utils.rb +86 -0
- data/lib/mm_es_search/utils/search_logger.rb +10 -0
- data/lib/mm_es_search/version.rb +3 -0
- data/lib/mm_es_search.rb +124 -0
- data/mm_es_search.gemspec +24 -0
- metadata +132 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class CustomFiltersScoreQuery < AbstractQuery
|
6
|
+
|
7
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
8
|
+
many :scored_filters, :class_name => 'MmEsSearch::Api::Query::ScoredFilter'
|
9
|
+
key :score_mode, Symbol
|
10
|
+
|
11
|
+
def to_mongo_query(options = {})
|
12
|
+
query = self.query.is_a?(MatchAllQuery) ? nil : self.query
|
13
|
+
filters = (scored_filters.map(&:filter) << query).compact
|
14
|
+
AndFilter.new(:filters => filters).to_mongo_query(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_es_query
|
18
|
+
query_params = {
|
19
|
+
:query => query.to_es_query,
|
20
|
+
:filters => scored_filters.map(&:to_es_query)
|
21
|
+
}
|
22
|
+
query_params[:score_mode] = score_mode unless score_mode.nil?
|
23
|
+
{:custom_filters_score => query_params}
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
class ScoredFilter
|
29
|
+
|
30
|
+
include MongoMapper::EmbeddedDocument
|
31
|
+
plugin MmUsesNoId
|
32
|
+
|
33
|
+
one :filter, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
34
|
+
key :boost, Float
|
35
|
+
key :script, String
|
36
|
+
|
37
|
+
def to_mongo_query
|
38
|
+
filter.to_mongo_query
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_es_query
|
42
|
+
filter_params = attributes.except('filter', '_type')
|
43
|
+
filter_params[:filter] = filter.to_es_query
|
44
|
+
filter_params
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class CustomScoreQuery < AbstractQuery
|
6
|
+
|
7
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
8
|
+
key :script, String
|
9
|
+
|
10
|
+
def to_mongo_query(options = {})
|
11
|
+
|
12
|
+
return query.to_mongo_query(options)
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_es_query
|
17
|
+
|
18
|
+
custom_score_params = {
|
19
|
+
:query => query.to_es_query,
|
20
|
+
:script => script
|
21
|
+
}
|
22
|
+
|
23
|
+
return {:custom_score => custom_score_params}
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class DismaxQuery < AbstractQuery
|
6
|
+
|
7
|
+
many :queries, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
8
|
+
key :tie_breaker, Float
|
9
|
+
key :boost, Float
|
10
|
+
|
11
|
+
def to_mongo_query(options = {})
|
12
|
+
raise 'Dis Max Query cannot be run as a mongo query'
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_es_query
|
16
|
+
|
17
|
+
dismax_params = {:queries => queries.map(&:to_es_query)}
|
18
|
+
dismax_params.merge!(:tie_breaker => tie_breaker) if tie_breaker?
|
19
|
+
dismax_params.merge!(:boost => boost) if boost?
|
20
|
+
|
21
|
+
return {:dis_max => dismax_params}
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class FilteredQuery < AbstractQuery
|
6
|
+
|
7
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
8
|
+
one :filter, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
9
|
+
|
10
|
+
def to_mongo_query(options = {})
|
11
|
+
if query.is_a?(MatchAllQuery) or query.nil?
|
12
|
+
filter.to_mongo_query(options)
|
13
|
+
else
|
14
|
+
AndFilter.new(:filters => [query, filter]).to_mongo_query(options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_es_query
|
19
|
+
if query.is_a?(MatchAllQuery) or query.nil?
|
20
|
+
{:filtered => {:query => MatchAllQuery.new.to_es_query, :filter => filter.to_es_query}}
|
21
|
+
else
|
22
|
+
{:filtered => {:query => query.to_es_query, :filter => filter.to_es_query}}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class HasChildQuery < AbstractQuery
|
6
|
+
|
7
|
+
key :type, Symbol
|
8
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
9
|
+
key :scope, String
|
10
|
+
|
11
|
+
def to_mongo_query(options = {})
|
12
|
+
raise NotImplementedError
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_es_query
|
16
|
+
params = {:type => type, :query => query.to_es_query}
|
17
|
+
params[:_scope] = scope if scope?
|
18
|
+
{:has_child => params}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class HasParentQuery < AbstractQuery
|
6
|
+
|
7
|
+
key :parent_type, Symbol
|
8
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
9
|
+
key :scope, String
|
10
|
+
|
11
|
+
def to_mongo_query(options = {})
|
12
|
+
raise NotImplementedError
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_es_query
|
16
|
+
params = {:parent_type => parent_type, :query => query.to_es_query}
|
17
|
+
params[:_scope] = scope if scope?
|
18
|
+
{:has_parent => params}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class NestedFilter < NestedQuery
|
6
|
+
|
7
|
+
plugin AbstractFilter
|
8
|
+
private
|
9
|
+
|
10
|
+
def es_api_keyword
|
11
|
+
:filter
|
12
|
+
end
|
13
|
+
|
14
|
+
def anded_query(query_array)
|
15
|
+
AndFilter.new(:filters => query_array)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class NestedQuery < AbstractQuery
|
6
|
+
|
7
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
8
|
+
key :path, String
|
9
|
+
key :score_mode, String
|
10
|
+
key :_scope, String
|
11
|
+
key :array_index_name, String
|
12
|
+
|
13
|
+
def to_mongo_query(options = {})
|
14
|
+
|
15
|
+
mod_path, array_index = path_and_index
|
16
|
+
if array_index.nil?
|
17
|
+
#NOTE: we assume here that earlier terms in a dot-joined path has been used in an enclosing nested query
|
18
|
+
{path.split('.').last => {'$elemMatch' => query.to_mongo_query(options)}}
|
19
|
+
else
|
20
|
+
query.to_mongo_query(options) #don't need elemMatch as index means we're addressing one document only
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_es_query
|
26
|
+
|
27
|
+
mod_path, array_index = path_and_index
|
28
|
+
mod_query = if array_index.nil?
|
29
|
+
query
|
30
|
+
else
|
31
|
+
query_array = [
|
32
|
+
query,
|
33
|
+
TermQuery.new(:path => mod_path, :field => array_index_name || '_array_index', :value => array_index)]
|
34
|
+
anded_query(query_array)
|
35
|
+
end
|
36
|
+
|
37
|
+
nested_params = {
|
38
|
+
es_api_keyword => mod_query.to_es_query,
|
39
|
+
:path => mod_path
|
40
|
+
}
|
41
|
+
nested_params.merge!({:score_mode => score_mode}) unless score_mode.nil?
|
42
|
+
nested_params.merge!({:_scope => _scope}) unless _scope.nil?
|
43
|
+
|
44
|
+
return {:nested => nested_params}
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def es_api_keyword
|
51
|
+
:query
|
52
|
+
end
|
53
|
+
|
54
|
+
def anded_query(query_array)
|
55
|
+
BoolQuery.new(:musts => query_array)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class PrefixQuery < AbstractQuery
|
6
|
+
|
7
|
+
key :field, String
|
8
|
+
key :path, String
|
9
|
+
|
10
|
+
key :value, String
|
11
|
+
key :boost, Float
|
12
|
+
|
13
|
+
def to_mongo_query(options = {})
|
14
|
+
prefix_regex = /^#{value}/
|
15
|
+
if options[:negated]
|
16
|
+
{mongo_abs_field => {'$ne' => prefix_regex}}
|
17
|
+
else
|
18
|
+
{mongo_abs_field => prefix_regex}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_es_query
|
23
|
+
if boost
|
24
|
+
{:prefix => {es_abs_field => {:value => value, :boost => boost}}}
|
25
|
+
else
|
26
|
+
{:prefix => {es_abs_field => value}}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class QueryFilter < AbstractQuery
|
6
|
+
plugin AbstractFilter
|
7
|
+
|
8
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
9
|
+
key :cache, Boolean
|
10
|
+
|
11
|
+
def to_mongo_query
|
12
|
+
query.to_mongo_query
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_es_query
|
16
|
+
query_params = {
|
17
|
+
:query => query.to_es_query
|
18
|
+
}
|
19
|
+
query_params[:_cache] = cache unless cache.nil?
|
20
|
+
{:fquery => query_params}
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class QueryStringQuery < AbstractQuery
|
6
|
+
|
7
|
+
key :query, String
|
8
|
+
key :default_field, String
|
9
|
+
key :boost, Float
|
10
|
+
key :default_operator, String
|
11
|
+
key :analyzer, String
|
12
|
+
key :allow_leading_wildcard, Boolean
|
13
|
+
key :lowercase_expanded_terms, Boolean
|
14
|
+
key :enable_position_increments, Boolean
|
15
|
+
key :fuzzy_prefix_length, Integer
|
16
|
+
key :fuzzy_min_sim, Float
|
17
|
+
key :phrase_slop, Integer
|
18
|
+
key :analyze_wildcard, Boolean
|
19
|
+
key :auto_generate_phrase_queries, Boolean
|
20
|
+
|
21
|
+
def to_mongo_query(options = {})
|
22
|
+
|
23
|
+
raise "QueryStringQuery doesn't support mongo execution"
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_es_query
|
28
|
+
|
29
|
+
return {:query_string => self.attributes.except("_type")}
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class RangeQuery < AbstractQuery
|
6
|
+
|
7
|
+
key :field, String
|
8
|
+
key :path, String
|
9
|
+
|
10
|
+
key :from
|
11
|
+
key :to
|
12
|
+
key :include_lower, :default => true
|
13
|
+
key :include_upper, :default => true
|
14
|
+
key :boost, Float
|
15
|
+
|
16
|
+
def to_mongo_query(options = {})
|
17
|
+
|
18
|
+
range_params = {}
|
19
|
+
|
20
|
+
if from
|
21
|
+
cmd = include_lower ? '$gte' : '$gt'
|
22
|
+
range_params.merge!({cmd => from})
|
23
|
+
end
|
24
|
+
|
25
|
+
if to
|
26
|
+
cmd = include_upper ? '$lte' : '$lt'
|
27
|
+
range_params.merge!({cmd => to})
|
28
|
+
end
|
29
|
+
|
30
|
+
if options[:negated]
|
31
|
+
return {mongo_abs_field => {"$not" => range_params}}
|
32
|
+
else
|
33
|
+
return {mongo_abs_field => range_params}
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_es_query
|
39
|
+
|
40
|
+
raise "must have either :from or :to" if from.nil? and to.nil?
|
41
|
+
|
42
|
+
range_params = {}
|
43
|
+
range_params.merge!({:from => from}) unless from.nil?
|
44
|
+
range_params.merge!({:to => to}) unless to.nil?
|
45
|
+
range_params.merge!({:include_lower => include_lower}) unless (from.nil? or include_lower == true)
|
46
|
+
range_params.merge!({:include_upper => include_upper}) unless (to.nil? or include_upper == true)
|
47
|
+
range_params.merge!({:boost => boost}) unless boost.nil?
|
48
|
+
|
49
|
+
return {:range => {es_abs_field => range_params}}
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class ScoredFilter
|
6
|
+
|
7
|
+
include MongoMapper::EmbeddedDocument
|
8
|
+
plugin MmUsesNoId
|
9
|
+
|
10
|
+
one :filter, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
11
|
+
key :boost, Float
|
12
|
+
key :script, String
|
13
|
+
|
14
|
+
def to_mongo_query
|
15
|
+
filter.to_mongo_query
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_es_query
|
19
|
+
filter_params = attributes.except('filter', '_type')
|
20
|
+
filter_params[:filter] = filter.to_es_query
|
21
|
+
filter_params
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class SingleBoolFilter < AbstractQuery
|
6
|
+
|
7
|
+
plugin AbstractFilter
|
8
|
+
|
9
|
+
many :filters, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
10
|
+
key :_cache, Boolean
|
11
|
+
|
12
|
+
def operator_name
|
13
|
+
self.class.to_s[0..-7].split('::').last.downcase #strip off "Filter" and downcase e.g. AndFilter => filter
|
14
|
+
end
|
15
|
+
|
16
|
+
def optimize_filters
|
17
|
+
opt_filters = []
|
18
|
+
filters.each do |child_filter|
|
19
|
+
if child_filter.is_a?(self.class)
|
20
|
+
opt_filters += child_filter.filters
|
21
|
+
else
|
22
|
+
opt_filters << child_filter
|
23
|
+
end
|
24
|
+
end
|
25
|
+
opt_filters
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_mongo_query(options = {})
|
29
|
+
case self
|
30
|
+
when NotFilter
|
31
|
+
negated_options = options.merge({:negated => !options[:negated]})
|
32
|
+
return AndFilter.new(:filters => filters).to_mongo_query(negated_options)
|
33
|
+
else
|
34
|
+
opt_filters = optimize_filters
|
35
|
+
filter_array = opt_filters.map {|filter| filter.to_mongo_query(options)}
|
36
|
+
if filter_array.length == 1
|
37
|
+
return filter_array.first
|
38
|
+
else
|
39
|
+
return {"$#{operator_name}" => filter_array}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_es_query
|
45
|
+
opt_filters = optimize_filters
|
46
|
+
filter_array = opt_filters.map {|query| query.to_es_query}
|
47
|
+
params = {}
|
48
|
+
case self
|
49
|
+
when NotFilter
|
50
|
+
if filter_array.length == 1
|
51
|
+
return {operator_name => {:filter => filter_array.first}}
|
52
|
+
else
|
53
|
+
return {operator_name => {:filter => {:or => filter_array}}}
|
54
|
+
end
|
55
|
+
else
|
56
|
+
params = {operator_name => filter_array}
|
57
|
+
end
|
58
|
+
params.merge!({"_cache" => _cache}) unless _cache.nil?
|
59
|
+
return params
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class TermQuery < AbstractQuery
|
6
|
+
|
7
|
+
key :field, String
|
8
|
+
key :path, String
|
9
|
+
|
10
|
+
key :value #string or number
|
11
|
+
key :boost, Float
|
12
|
+
|
13
|
+
def to_mongo_query(options = {})
|
14
|
+
|
15
|
+
if options[:negated]
|
16
|
+
{mongo_abs_field => {'$ne' => value}}
|
17
|
+
else
|
18
|
+
{mongo_abs_field => value}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_es_query
|
23
|
+
if boost
|
24
|
+
{:term => {es_abs_field => {:value => value, :boost => boost}}}
|
25
|
+
else
|
26
|
+
{:term => {es_abs_field => value}}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|