Commit fc8893c339cb33e46b177f37823f746aed76a423

Authored by Andrew Kane
1 parent 7c2a7e65

Use suggestions from all fields

lib/searchkick/model.rb
... ... @@ -24,9 +24,22 @@ module Searchkick
24 24  
25 25 def to_indexed_json
26 26 source = search_data
27   - if self.class.instance_variable_get("@searchkick_options")[:conversions] and source[:conversions]
28   - source[:conversions] = source[:conversions].map{|k, v| {query: k, count: v} }
  27 +
  28 + # stringify fields
  29 + source = source.inject({}){|memo,(k,v)| memo[k.to_s] = v; memo}
  30 +
  31 + options = self.class.instance_variable_get("@searchkick_options")
  32 +
  33 + # conversions
  34 + if options[:conversions] and source["conversions"]
  35 + source["conversions"] = source["conversions"].map{|k, v| {query: k, count: v} }
29 36 end
  37 +
  38 + # hack to prevent generator field doesn't exist error
  39 + (options[:suggest] || []).map(&:to_s).each do |field|
  40 + source[field] = "a" if !source[field]
  41 + end
  42 +
30 43 source.to_json
31 44 end
32 45 end
... ...
lib/searchkick/reindex.rb
... ... @@ -147,8 +147,8 @@ module Searchkick
147 147 end
148 148  
149 149 # autocomplete and suggest
150   - autocomplete = options[:autocomplete] || []
151   - suggest = options[:suggest] || []
  150 + autocomplete = (options[:autocomplete] || []).map(&:to_s)
  151 + suggest = (options[:suggest] || []).map(&:to_s)
152 152 (autocomplete + suggest).uniq.each do |field|
153 153 field_mapping = {
154 154 type: "multi_field",
... ...
lib/searchkick/results.rb
... ... @@ -5,7 +5,7 @@ module Searchkick
5 5 # return nil suggestion if term does not change
6 6 def suggestions
7 7 if @response["suggest"]
8   - @response["suggest"].values.first.first["options"].map{|s| s["text"] } rescue []
  8 + @response["suggest"].values.flat_map{|v| v.first["options"] }.sort_by{|o| -o["score"] }.map{|o| o["text"] }.uniq
9 9 else
10 10 raise "Pass `suggest: true` to the search method for suggestions"
11 11 end
... ...
test/suggest_test.rb
... ... @@ -21,10 +21,43 @@ class TestSuggest < Minitest::Unit::TestCase
21 21 assert_raises(RuntimeError){ Product.search("hi").suggestions }
22 22 end
23 23  
  24 + def test_multiple_fields
  25 + store [
  26 + {name: "Shark", color: "Sharp"}
  27 + ]
  28 + assert_suggest_all "shar", ["shark", "sharp"]
  29 + end
  30 +
  31 + def test_multiple_fields_highest_score_first
  32 + store [
  33 + {name: "Tiger Shark", color: "Sharp"}
  34 + ]
  35 + assert_suggest "tiger shar", "tiger shark"
  36 + end
  37 +
  38 + def test_multiple_fields_same_value
  39 + store [
  40 + {name: "Shark", color: "Shark"}
  41 + ]
  42 + assert_suggest_all "shar", ["shark"]
  43 + end
  44 +
  45 + def test_fields_option
  46 + store [
  47 + {name: "Shark", color: "Sharp"}
  48 + ]
  49 + assert_suggest_all "shar", ["shark"], fields: [:name]
  50 + end
  51 +
24 52 protected
25 53  
26 54 def assert_suggest(term, expected)
27 55 assert_equal expected, Product.search(term, suggest: true).suggestions.first
28 56 end
29 57  
  58 + # any order
  59 + def assert_suggest_all(term, expected, options = {})
  60 + assert_equal expected.sort, Product.search(term, options.merge(suggest: true)).suggestions.sort
  61 + end
  62 +
30 63 end
... ...
test/test_helper.rb
... ... @@ -49,7 +49,7 @@ class Product < ActiveRecord::Base
49 49 ["bandaid", "bandag"]
50 50 ],
51 51 autocomplete: [:name],
52   - suggest: [:name]
  52 + suggest: [:name, :color]
53 53  
54 54 attr_accessor :conversions, :user_ids
55 55  
... ...