Commit fc8893c339cb33e46b177f37823f746aed76a423
1 parent
7c2a7e65
Exists in
master
and in
21 other branches
Use suggestions from all fields
Showing
5 changed files
with
52 additions
and
6 deletions
Show diff stats
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 | ... | ... |