mm_es_search 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|