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
data/.gitignore
ADDED
data/.project
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<projectDescription>
|
3
|
+
<name>mm_es_search</name>
|
4
|
+
<comment></comment>
|
5
|
+
<projects>
|
6
|
+
</projects>
|
7
|
+
<buildSpec>
|
8
|
+
<buildCommand>
|
9
|
+
<name>com.aptana.ide.core.unifiedBuilder</name>
|
10
|
+
<arguments>
|
11
|
+
</arguments>
|
12
|
+
</buildCommand>
|
13
|
+
</buildSpec>
|
14
|
+
<natures>
|
15
|
+
<nature>org.radrails.rails.core.railsnature</nature>
|
16
|
+
<nature>com.aptana.ruby.core.rubynature</nature>
|
17
|
+
</natures>
|
18
|
+
</projectDescription>
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Facet
|
4
|
+
|
5
|
+
class AbstractFacet
|
6
|
+
|
7
|
+
include MongoMapper::EmbeddedDocument
|
8
|
+
include MmEsSearch::Api::Query
|
9
|
+
plugin MmUsesNoId
|
10
|
+
|
11
|
+
key :label, String
|
12
|
+
key :nested, String
|
13
|
+
key :scope, String
|
14
|
+
one :facet_filter, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
15
|
+
|
16
|
+
def to_es_query
|
17
|
+
facet_params = {}
|
18
|
+
facet_params.merge!(:scope => scope) if scope?
|
19
|
+
facet_params.merge!(:nested => nested) if nested?
|
20
|
+
facet_params.merge!(:facet_filter => facet_filter.to_es_query) if facet_filter?
|
21
|
+
return facet_params
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Facet
|
4
|
+
|
5
|
+
class RangeFacet < AbstractFacet
|
6
|
+
|
7
|
+
key :field, String
|
8
|
+
many :ranges, :class_name => 'MmEsSearch::Api::Facet::RangeItem'
|
9
|
+
key :key_field, String
|
10
|
+
key :value_field, String
|
11
|
+
key :key_script, String
|
12
|
+
key :value_script, String
|
13
|
+
key :params, Hash
|
14
|
+
|
15
|
+
def to_es_query
|
16
|
+
|
17
|
+
range_params = {}
|
18
|
+
range_params.merge!(:field => field) if field?
|
19
|
+
range_params.merge!(:ranges => ranges.map(&:attributes))
|
20
|
+
range_params.merge!(:key_field => size) if key_field?
|
21
|
+
range_params.merge!(:value_field => size) if value_field?
|
22
|
+
range_params.merge!(:key_script => size) if key_script?
|
23
|
+
range_params.merge!(:value_script => size) if value_script?
|
24
|
+
range_params.merge!(:params => params) unless params.empty?
|
25
|
+
|
26
|
+
facet_params = {:range => range_params}.merge(super)
|
27
|
+
|
28
|
+
return {label => facet_params}
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Facet
|
4
|
+
|
5
|
+
class RangeFacetRow
|
6
|
+
|
7
|
+
include MongoMapper::EmbeddedDocument
|
8
|
+
include ActionView::Helpers::NumberHelper
|
9
|
+
plugin MmUsesUuid
|
10
|
+
|
11
|
+
key :from
|
12
|
+
key :to
|
13
|
+
key :count, Integer
|
14
|
+
key :min
|
15
|
+
key :max
|
16
|
+
key :total_count, Integer
|
17
|
+
key :total
|
18
|
+
key :mean
|
19
|
+
|
20
|
+
key :checked, String
|
21
|
+
|
22
|
+
def from=(val)
|
23
|
+
super.tap do
|
24
|
+
binding.pry if from.is_a?(DateTime)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def attributes(*args)
|
29
|
+
attr = super
|
30
|
+
attr.each_with_object({}) do |(key, value), hsh|
|
31
|
+
hsh[key] = case value
|
32
|
+
when ActiveSupport::TimeWithZone
|
33
|
+
value.utc.to_time
|
34
|
+
else
|
35
|
+
value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
alias :to_mongo :attributes
|
40
|
+
|
41
|
+
def zero_count
|
42
|
+
self.count = 0
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_range_item
|
46
|
+
RangeItem.new(
|
47
|
+
:from => from,
|
48
|
+
:to => to
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_english(pretty_print = true)
|
53
|
+
case from || to
|
54
|
+
when Numeric
|
55
|
+
render_numeric(pretty_print)
|
56
|
+
when Time, DateTime
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def render_numeric(pretty_print)
|
61
|
+
|
62
|
+
if pretty_print
|
63
|
+
#TODO handle units (see http://bit.ly/rhx05t)
|
64
|
+
from_formatted = number_to_human(from) if from?
|
65
|
+
to_formatted = number_to_human(to) if to?
|
66
|
+
else
|
67
|
+
from_formatted = from if from?
|
68
|
+
to_formatted = to if to?
|
69
|
+
end
|
70
|
+
|
71
|
+
if from? and to?
|
72
|
+
"from #{from_formatted} to #{to_formatted}"
|
73
|
+
elsif from?
|
74
|
+
"#{from_formatted} or greater"
|
75
|
+
else
|
76
|
+
"upto #{to_formatted}"
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_form_name(data_type)
|
82
|
+
params = []
|
83
|
+
params << "data_type:#{data_type}"
|
84
|
+
params << "from:#{from}" if from?
|
85
|
+
params << "to:#{to}" if to?
|
86
|
+
return params.join('&')
|
87
|
+
end
|
88
|
+
|
89
|
+
def parent
|
90
|
+
_parent_document
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Facet
|
4
|
+
|
5
|
+
class StatisticalFacet < AbstractFacet
|
6
|
+
|
7
|
+
key :field #Array or String
|
8
|
+
key :script, String
|
9
|
+
key :params, Hash
|
10
|
+
|
11
|
+
def to_es_query
|
12
|
+
|
13
|
+
stat_params = if script
|
14
|
+
script_params = {:script => script}
|
15
|
+
script_params.merge!({:params => params}) if params?
|
16
|
+
script_params
|
17
|
+
elsif field.is_a?(Array)
|
18
|
+
{:fields => field}
|
19
|
+
else
|
20
|
+
{:field => field}
|
21
|
+
end
|
22
|
+
|
23
|
+
facet_params = {:statistical => stat_params}.merge(super)
|
24
|
+
|
25
|
+
return {label => facet_params}
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Facet
|
4
|
+
|
5
|
+
class StatisticalFacetResult
|
6
|
+
|
7
|
+
include MongoMapper::EmbeddedDocument
|
8
|
+
plugin MmUsesNoId
|
9
|
+
|
10
|
+
key :count, Integer
|
11
|
+
key :total
|
12
|
+
key :sum_of_squares
|
13
|
+
key :mean
|
14
|
+
key :min
|
15
|
+
key :max
|
16
|
+
key :variance
|
17
|
+
key :std_deviation
|
18
|
+
|
19
|
+
def attributes(*args)
|
20
|
+
attr = super
|
21
|
+
attr.each_with_object({}) do |(key, value), hsh|
|
22
|
+
hsh[key] = case value
|
23
|
+
when ActiveSupport::TimeWithZone
|
24
|
+
value.utc.to_time
|
25
|
+
else
|
26
|
+
value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
alias :to_mongo :attributes
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Facet
|
4
|
+
|
5
|
+
class TermsFacet < AbstractFacet
|
6
|
+
|
7
|
+
key :field #Array or String
|
8
|
+
key :path, String
|
9
|
+
|
10
|
+
key :size, Integer
|
11
|
+
key :order, String
|
12
|
+
key :exclude, Array #of Strings
|
13
|
+
|
14
|
+
key :script_field, String
|
15
|
+
|
16
|
+
key :regex, String
|
17
|
+
key :regex_flags, String
|
18
|
+
|
19
|
+
key :script, String
|
20
|
+
key :params, Hash
|
21
|
+
|
22
|
+
def qualified_field(field_name)
|
23
|
+
if path.present?
|
24
|
+
[path, field_name].join(".")
|
25
|
+
else
|
26
|
+
field_name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_es_query
|
31
|
+
|
32
|
+
mod_field = case field
|
33
|
+
when Array
|
34
|
+
field.map { |fname| qualified_field(fname) }
|
35
|
+
when String
|
36
|
+
qualified_field(field)
|
37
|
+
end
|
38
|
+
|
39
|
+
term_params = {}
|
40
|
+
term_params.merge!(:field => mod_field) if field.is_a?(String)
|
41
|
+
term_params.merge!(:fields => mod_field) if field.is_a?(Array)
|
42
|
+
term_params.merge!(:size => size) if (size? and size != 10)
|
43
|
+
term_params.merge!(:order => order) if (order? and order != "count")
|
44
|
+
term_params.merge!(:exclude => exclude) unless exclude.empty?
|
45
|
+
term_params.merge!(:script_field => script_field) if script_field?
|
46
|
+
term_params.merge!(:regex => regex) if regex?
|
47
|
+
term_params.merge!(:regex_flags => script_field) if regex_flags?
|
48
|
+
term_params.merge!(:script => script) if script?
|
49
|
+
term_params.merge!(:params => params) unless params.empty?
|
50
|
+
|
51
|
+
facet_params = {:terms => term_params}.merge(super)
|
52
|
+
|
53
|
+
return {label => facet_params}
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Facet
|
4
|
+
|
5
|
+
class TermsFacetRow
|
6
|
+
|
7
|
+
include MongoMapper::EmbeddedDocument
|
8
|
+
plugin MmUsesUuid
|
9
|
+
|
10
|
+
key :term, String
|
11
|
+
key :count, Integer
|
12
|
+
|
13
|
+
key :checked, String
|
14
|
+
|
15
|
+
def zero_count
|
16
|
+
self.count = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_english(pretty_print = true)
|
20
|
+
StringUtils.label_from_URI(term)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_form_name(data_type)
|
24
|
+
term
|
25
|
+
end
|
26
|
+
|
27
|
+
def parent
|
28
|
+
_parent_document
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Highlight
|
4
|
+
|
5
|
+
class ResultHighlight
|
6
|
+
|
7
|
+
include MongoMapper::EmbeddedDocument
|
8
|
+
plugin MmUsesNoId
|
9
|
+
|
10
|
+
many :fields, :class_name => 'MmEsSearch::Api::Highlight::ResultHighlight'
|
11
|
+
key :field, String
|
12
|
+
key :tag_schema, String
|
13
|
+
key :pre_tags, Array
|
14
|
+
key :post_tags, Array
|
15
|
+
key :fragment_size, Integer
|
16
|
+
key :number_of_fragments, Integer
|
17
|
+
key :order, String
|
18
|
+
|
19
|
+
def to_mongo_query
|
20
|
+
|
21
|
+
raise "to_mongo_query not implemented for ResultHighlight"
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_es_query
|
26
|
+
|
27
|
+
highlight_params = self.attributes.except("fields", "pre_tags", "post_tags")
|
28
|
+
highlight_params.merge!(:fields => fields.map(&:to_es_query)) unless fields.empty?
|
29
|
+
highlight_params.merge!(:pre_tags => pre_tags) unless pre_tags.empty?
|
30
|
+
highlight_params.merge!(:post_tags => post_tags) unless post_tags.empty?
|
31
|
+
|
32
|
+
return field? ? {field => highlight_params.except('field')} : highlight_params
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class AbstractQuery
|
6
|
+
|
7
|
+
include MongoMapper::EmbeddedDocument
|
8
|
+
plugin MmUsesNoId
|
9
|
+
|
10
|
+
def to_filter
|
11
|
+
QueryFilter.new(query: self)
|
12
|
+
end
|
13
|
+
|
14
|
+
def es_abs_field
|
15
|
+
if path?
|
16
|
+
mod_path, indx = path_and_index
|
17
|
+
return [mod_path, field].join('.')
|
18
|
+
else
|
19
|
+
return field
|
20
|
+
end
|
21
|
+
#TODO make sure we don't need to prefix path anymore - looks like we do if same name used at diff nesting levels, so always include to be safe
|
22
|
+
end
|
23
|
+
|
24
|
+
def mongo_abs_field
|
25
|
+
mod_path, array_index = path_and_index
|
26
|
+
return array_index.nil? ? field : [path, field].join('.')
|
27
|
+
end
|
28
|
+
|
29
|
+
def path_and_index
|
30
|
+
|
31
|
+
case path
|
32
|
+
when /(?<=\.)[0-9]+$/
|
33
|
+
mod_path = path.gsub(/\.[0-9]+/,'')
|
34
|
+
array_index = path.split('.').last.to_i
|
35
|
+
else
|
36
|
+
mod_path = path
|
37
|
+
array_index = nil
|
38
|
+
end
|
39
|
+
|
40
|
+
return mod_path, array_index
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class BoolQuery < AbstractQuery
|
6
|
+
|
7
|
+
many :musts, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
8
|
+
many :shoulds, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
9
|
+
many :must_nots, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
10
|
+
key :boost, Float
|
11
|
+
key :minimum_number_should_match, Integer
|
12
|
+
|
13
|
+
def validate
|
14
|
+
raise "cannot have a must_not by itself in a BoolQuery" if (musts.empty? and shoulds.empty? and not self.is_a?(BoolFilter))
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_mongo_query(options = {})
|
18
|
+
|
19
|
+
validate
|
20
|
+
|
21
|
+
negated_options = options.merge({:negated => !options[:negated]})
|
22
|
+
|
23
|
+
and_array = musts.map {|query| query.to_mongo_query(options)} + must_nots.map {|query| query.to_mongo_query(negated_options)}
|
24
|
+
or_array = shoulds.map {|query| query.to_mongo_query(options)}
|
25
|
+
|
26
|
+
bool_params = {}
|
27
|
+
bool_params.merge!({'$and' => and_array}) unless and_array.empty?
|
28
|
+
bool_params.merge!({'$or' => or_array}) unless or_array.empty?
|
29
|
+
|
30
|
+
return bool_params
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_es_query
|
35
|
+
|
36
|
+
validate
|
37
|
+
|
38
|
+
# use more optimal and, or, not SingleBoolFilter if appropriate
|
39
|
+
if self.is_a?(BoolFilter)
|
40
|
+
if (shoulds + must_nots).empty? and not musts.empty? and boost.nil?
|
41
|
+
return AndFilter.new(:filters => musts).to_es_query
|
42
|
+
elsif (musts + must_nots).empty? and not shoulds.empty? and boost.nil? and minimum_number_should_match == 1
|
43
|
+
return OrFilter.new(:filters => shoulds).to_es_query
|
44
|
+
elsif (musts + shoulds).empty? and not must_nots.empty? and boost.nil?
|
45
|
+
return NotFilter.new(:filters => must_nots).to_es_query
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
must_array = musts.map {|query| query.to_es_query}
|
50
|
+
should_array = shoulds.map {|query| query.to_es_query}
|
51
|
+
must_not_array = must_nots.map {|query| query.to_es_query}
|
52
|
+
|
53
|
+
bool_params = {}
|
54
|
+
bool_params.merge!({:must => must_array}) unless must_array.empty?
|
55
|
+
bool_params.merge!({:should => should_array}) unless should_array.empty?
|
56
|
+
bool_params.merge!({:must_not => must_not_array}) unless must_not_array.empty?
|
57
|
+
bool_params.merge!({:boost => boost}) unless boost.nil?
|
58
|
+
bool_params.merge!({:minimum_number_should_match => minimum_number_should_match}) if minimum_number_should_match?
|
59
|
+
return {:bool => bool_params}
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module MmEsSearch
|
2
|
+
module Api
|
3
|
+
module Query
|
4
|
+
|
5
|
+
class ConstantScoreQuery < AbstractQuery
|
6
|
+
|
7
|
+
one :query, :class_name => 'MmEsSearch::Api::Query::AbstractQuery'
|
8
|
+
key :boost, Integer
|
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
|
+
constant_score_params = {
|
19
|
+
:query => query.to_es_query
|
20
|
+
}
|
21
|
+
constant_score_params.merge!(:boost => boost) if boost?
|
22
|
+
|
23
|
+
return {:constant_score => constant_score_params}
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|