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,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 |