Commit 0337e063246def3a47733a0a7afb3a02b30852e2

Authored by Richard King
1 parent cd7d3220

add boost_mode

Showing 2 changed files with 30 additions and 30 deletions   Show diff stats
lib/searchkick/query.rb
... ... @@ -167,14 +167,17 @@ module Searchkick
167 167 custom_filters = []
168 168  
169 169 boost_by = options[:boost_by] || {}
  170 +
170 171 if boost_by.is_a?(Array)
171   - boost_by = Hash[boost_by.map { |f| [f, {factor: 1}] }]
  172 + boost_by_sum = Hash[boost_by.map { |f| [f, {factor: 1}] }]
  173 + elsif boost_by.is_a?(Hash)
  174 + boost_by_multiply, boost_by_sum = boost_by.partition { |k,v| v[:boost_mode] == "multiply" }.map{|i| Hash[i] }
172 175 end
173 176 if options[:boost]
174   - boost_by[options[:boost]] = {factor: 1}
  177 + boost_by_sum[options[:boost]] = {factor: 1}
175 178 end
176 179  
177   - boost_by.each do |field, value|
  180 + boost_by_sum.each do |field, value|
178 181 script_score =
179 182 if below12
180 183 {script_score: {script: "#{value[:factor].to_f} * log(doc['#{field}'].value + 2.718281828)"}}
... ... @@ -191,6 +194,28 @@ module Searchkick
191 194 }.merge(script_score)
192 195 end
193 196  
  197 + if boost_by_multiply
  198 + multiply_filters = []
  199 +
  200 + boost_by_multiply.each do |field, value|
  201 + script_score =
  202 + if below12
  203 + {script_score: {script: "#{value[:factor].to_f} * doc['#{field}'].value"}}
  204 + else
  205 + value[:factor] ||= 1
  206 + {field_value_factor: {field: field, factor: value[:factor].to_f}}
  207 + end
  208 +
  209 + multiply_filters << {
  210 + filter: {
  211 + exists: {
  212 + field: field
  213 + }
  214 + }
  215 + }.merge(script_score)
  216 + end
  217 + end
  218 +
194 219 boost_where = options[:boost_where] || {}
195 220 if options[:user_id] && personalize_field
196 221 boost_where[personalize_field] = options[:user_id]
... ... @@ -238,31 +263,7 @@ module Searchkick
238 263 }
239 264 end
240 265  
241   - multiply_filters = []
242   -
243   - multiply_by = options[:multiply_by] || {}
244   - if multiply_by.is_a?(Array)
245   - multiply_by = Hash[multiply_by.map { |f| [f, {factor: 1}] }]
246   - end
247   -
248   - multiply_by.each do |field, value|
249   - script_score =
250   - if below12
251   - {script_score: {script: "#{value[:factor].to_f} * doc['#{field}'].value"}}
252   - else
253   - {field_value_factor: {field: field, factor: value[:factor].to_f}}
254   - end
255   -
256   - multiply_filters << {
257   - filter: {
258   - exists: {
259   - field: field
260   - }
261   - }
262   - }.merge(script_score)
263   - end
264   -
265   - if multiply_filters.any?
  266 + if multiply_filters && multiply_filters.any?
266 267 payload = {
267 268 function_score: {
268 269 functions: multiply_filters,
... ...
test/boost_test.rb
... ... @@ -108,8 +108,7 @@ class TestBoost &lt; Minitest::Test
108 108 {name: "Tomato C", found_rate: 0.5}
109 109 ]
110 110  
111   - assert_order "tomato", ["Tomato B", "Tomato A", "Tomato C"], multiply_by: [:found_rate]
112   - assert_order "tomato", ["Tomato B", "Tomato A", "Tomato C"], multiply_by: {found_rate: {factor: 1}}
  111 + assert_order "tomato", ["Tomato B", "Tomato A", "Tomato C"], boost_by: {found_rate: {factor: 1, boost_mode: "multiply"}}
113 112 end
114 113  
115 114 def test_boost_where
... ...