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,9 +24,22 @@ module Searchkick
24 24
25 def to_indexed_json 25 def to_indexed_json
26 source = search_data 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 end 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 source.to_json 43 source.to_json
31 end 44 end
32 end 45 end
lib/searchkick/reindex.rb
@@ -147,8 +147,8 @@ module Searchkick @@ -147,8 +147,8 @@ module Searchkick
147 end 147 end
148 148
149 # autocomplete and suggest 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 (autocomplete + suggest).uniq.each do |field| 152 (autocomplete + suggest).uniq.each do |field|
153 field_mapping = { 153 field_mapping = {
154 type: "multi_field", 154 type: "multi_field",
lib/searchkick/results.rb
@@ -5,7 +5,7 @@ module Searchkick @@ -5,7 +5,7 @@ module Searchkick
5 # return nil suggestion if term does not change 5 # return nil suggestion if term does not change
6 def suggestions 6 def suggestions
7 if @response["suggest"] 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 else 9 else
10 raise "Pass `suggest: true` to the search method for suggestions" 10 raise "Pass `suggest: true` to the search method for suggestions"
11 end 11 end
test/suggest_test.rb
@@ -21,10 +21,43 @@ class TestSuggest < Minitest::Unit::TestCase @@ -21,10 +21,43 @@ class TestSuggest < Minitest::Unit::TestCase
21 assert_raises(RuntimeError){ Product.search("hi").suggestions } 21 assert_raises(RuntimeError){ Product.search("hi").suggestions }
22 end 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 protected 52 protected
25 53
26 def assert_suggest(term, expected) 54 def assert_suggest(term, expected)
27 assert_equal expected, Product.search(term, suggest: true).suggestions.first 55 assert_equal expected, Product.search(term, suggest: true).suggestions.first
28 end 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 end 63 end
test/test_helper.rb
@@ -49,7 +49,7 @@ class Product < ActiveRecord::Base @@ -49,7 +49,7 @@ class Product < ActiveRecord::Base
49 ["bandaid", "bandag"] 49 ["bandaid", "bandag"]
50 ], 50 ],
51 autocomplete: [:name], 51 autocomplete: [:name],
52 - suggest: [:name] 52 + suggest: [:name, :color]
53 53
54 attr_accessor :conversions, :user_ids 54 attr_accessor :conversions, :user_ids
55 55